abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
AbcLinuxu hledá autory!
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×

dnes 12:33 | Zajímavý software

Článek ne Medium představuje nejnovější stabilní verzi 2.0 svobodné decentralizované mikroblogovací platformy a sociální sítě podobné Twitteru Mastodon (Wikipedie). Detailní přehled novinek na GitHubu [Hacker News].

Ladislav Hagara | Komentářů: 0
dnes 06:00 | Komunita

V Praze na půdě Elektrotechnické fakulty ČVUT dnes probíhá RT-Summit 2017 – setkání vývojářů linuxového jádra a uživatelů jeho real-time verze označované jako preempt-rt. Přednášky lze sledovat online na YouTube.

Ladislav Hagara | Komentářů: 0
včera 14:33 | Zajímavý projekt

Blender Animation Studio zveřejnilo první epizodu z připravovaného animovaného seriálu The Daily Dweebs o domácím mazlíčkovi jménem Dixey. Ke zhlédnutí také ve 3D s rozlišením 8K.

Ladislav Hagara | Komentářů: 0
včera 12:34 | Komunita

Aktualizovanou počítačovou hru Warhammer 40,000: Dawn of War III v ceně 39,99 eur běžící také na Linuxu lze o víkendu na Steamu hrát zdarma a případně ještě v pondělí koupit s 50% slevou. Do soboty 19:00 lze na Humble Bundle získat zdarma Steam klíč k počítačové hře Sid Meier's Civilization® III v ceně 4,99 eur běžící také ve Wine.

Ladislav Hagara | Komentářů: 0
včera 00:22 | Nasazení Linuxu

Společnost Samsung oznámila, že skrze dokovací stanici DeX a aplikaci Linux on Galaxy bude možno na Samsung Galaxy S8 a S8+ a Galaxy Note 8 provozovat Linux. Distribuce nebyly blíže upřesněny.

Phantom Alien | Komentářů: 19
19.10. 23:55 | Komunita

Společnost Purism na svém blogu oznámila, že její notebooky Librem jsou nově dodávány se zrušeným (neutralized and disabled) Intel Management Engine (ME). Aktualizací corebootu na již prodaných noteboocích lze Management Engine také zrušit. Více v podrobném článku.

Ladislav Hagara | Komentářů: 0
19.10. 21:44 | Nová verze

Organizace Apache Software Foundation (ASF) na svém blogu slaví páté výročí kancelářského balíku Apache OpenOffice jako jejího Top-Level projektu. Při této příležitosti byl vydán Apache OpenOffice 4.1.4 (AOO 4.1.4). Podrobnosti v poznámkách k vydání. Dlouhé čekání na novou verzi tak skončilo.

Ladislav Hagara | Komentářů: 6
19.10. 19:22 | Pozvánky

Již příští týden - 26. a 27. října se v Praze v hotelu Olšanka odehraje OpenWRT Summit. Na webu konference naleznete program a možnost zakoupení lístků - ty stojí 55 dolarů. Čtvrtek bude přednáškový a v pátek se budou odehrávat převážně workshopy a meetingy.

Miška | Komentářů: 1
19.10. 13:44 | Nová verze

Bylo vydáno Ubuntu 17.10 s kódovým názvem Artful Aardvark. Ke stažení jsou Ubuntu Desktop a Server, Ubuntu Cloud Images, Ubuntu Netboot, Kubuntu, Lubuntu a Lubuntu Alternate, Lubuntu Next, Ubuntu Budgie, Ubuntu Kylin, Ubuntu MATE, Ubuntu Studio a Xubuntu. Podrobnosti v poznámkách k vydání.

Ladislav Hagara | Komentářů: 23
19.10. 13:00 | Komunita

MojeFedora.cz informuje, že Fedora 27 dostane podporu pro AAC. Podpora multimediálních formátů je ve výchozí instalaci Fedory tradičně limitovaná kvůli softwarovým patentům, ale desktopový tým Red Hatu se ji i tak snaží v poslední době co nejvíce rozšířit. Už nějaký čas obsahuje kodeky pro MP3, H.264, AC3 a nyní byl přidán také kodek pro další velmi rozšířený zvukový formát – AAC.

Ladislav Hagara | Komentářů: 2
Jak se vás potenciálně dotkne trend odstraňování analogového audio konektoru typu 3,5mm jack z „chytrých telefonů“?
 (10%)
 (1%)
 (1%)
 (1%)
 (75%)
 (13%)
Celkem 167 hlasů
 Komentářů: 7, poslední 19.10. 23:06
    Rozcestník
    Štítky: není přiřazen žádný štítek

    Vložit další komentář
    oryctolagus avatar 10.2. 17:15 oryctolagus | skóre: 29 | blog: Untitled
    Rozbalit Rozbalit vše Re: C++ templaty, member function pointer
    Proč castuješ tu callback member funkci na member funkci toho funktoru? Pointer na member funkce jsou divný, můžou mít různý velikosti.

    Stejnětak mi není jasný, proč castuješ A *o na *functor, možná to jen nechápu...
    Existuje 10 druhů lidí: Ti, co nerozumí binární soustavě, ti, co ano, a ti, kteří znají i balancovanou ternární.
    vlastikroot avatar 10.2. 18:26 vlastikroot | skóre: 24 | blog: vlastikovo | Milevsko
    Rozbalit Rozbalit vše Re: C++ templaty, member function pointer
    Ach tak, to vypada jako slusny zlo. Ten cast tam delam kvuli tomu, abych ochcal C++ a mohl ulozit pointer na jakoukoli class. Podle toho co jsi mi poslal by to mohl byt problem, jestli je kazdy pointer fyzicky jiny.
    Sg1-game | We will destroys the Christian's legion ... and the cross, will be inverted | IP 80.188.182.6
    oryctolagus avatar 10.2. 23:37 oryctolagus | skóre: 29 | blog: Untitled
    Rozbalit Rozbalit vše Re: C++ templaty, member function pointer
    Tak si tam dej nějakej datovej typ dostatečně velkej i na fakt obézní member pointery a do nej do kopíruj. Třeba struct { size_t a; size_t b; };

    Nejspíš by se i našel způsob, jak během compile-time zjistit, jestli ten member func pointer není větší...
    Existuje 10 druhů lidí: Ti, co nerozumí binární soustavě, ti, co ano, a ti, kteří znají i balancovanou ternární.
    11.2. 00:31 Sten
    Rozbalit Rozbalit vše Re: C++ templaty, member function pointer
    To nebude fungovat v operator (), protože tam se to castuje na jiný typ, než který byl uložený, a každý může mít jinak velké member pointery.
    11.2. 10:33 Jardík
    Rozbalit Rozbalit vše Re: C++ templaty, member function pointer
    Jestli kompiluje GCC na x86-64, tak všechny pointery na member fci jsou 16 bytů (8 bytů offset k this a 8 bytů buď adresa member fce, či index do vtable (Itanium C++ ABI). Na x86 je to stejné, akorát je to 4+4 bytů. Pokud by autorovi příspěvku nevadila další indirekce, mohl by urobit template member fci jako wrapper a pak by mu stačil jen obyč pointer na funkci. Protože narozdíl od obyč pointeru na funkci je pointer na member funkci compile-time konstanta a může být použit jako template argument. Úspora je však sporná - zase bude více kódu ve výsledné binárce pro wrapper funkci, ale když se bude opakovat stejný callback a nebudou všechny různé, úspora bude. A ten typeid check vyhoď z release buildu (#ifndef NDEBUG ... #endif)
    vlastikroot avatar 11.2. 16:00 vlastikroot | skóre: 24 | blog: vlastikovo | Milevsko
    Rozbalit Rozbalit vše Re: C++ templaty, member function pointer
    Nevis jak je to na ARMu? Ten kod je cilenej na ARM.
    Sg1-game | We will destroys the Christian's legion ... and the cross, will be inverted | IP 80.188.182.6
    11.2. 16:30 Jardík
    Rozbalit Rozbalit vše Re: C++ templaty, member function pointer
    Můžeš zkusit web kompilátor tu, vpravo to ukazuje výsledný asm kód. Oba pointery na nevirtuální fce vypadají, že mají stejnou velikost (label .L5, u obou je "word" (asi velikost slova, kolik to je, nevím)). To implikuje i stejnou velikost pointeru na virtuální metodu (pointer na virtuální a nevirtuální metodu stejné signatury stejné třídy musí být kompatibilní).
    11.2. 17:15 pc2005 | skóre: 34 | blog: GardenOfEdenConfiguration | liberec
    Rozbalit Rozbalit vše Re: C++ templaty, member function pointer
    16 bajtů složenýho ukazatele? To musí ten C++ kód neskutečně zpomalovat ne? (já jsem teda céčkař)
    Chuck Norris řekl babičce, že si dá jen 3 knedlíky. A dostal 3 knedlíky. | 帮帮我,我被锁在中国房
    11.2. 17:37 Jardík
    Rozbalit Rozbalit vše Re: C++ templaty, member function pointer
    To je na member fcu, na statickou je to jen 8, jako v C. Pro každou member fcu je však možné vytvořit statickou wrapper fci, pomocí šablon.
    Josef Kufner avatar 10.2. 17:31 Josef Kufner | skóre: 67
    Rozbalit Rozbalit vše Re: C++ templaty, member function pointer
    Nebylo by lepší hodit výjimku namísto ladicího výpisu?
    Hello world ! Segmentation fault (core dumped)
    vlastikroot avatar 10.2. 18:26 vlastikroot | skóre: 24 | blog: vlastikovo | Milevsko
    Rozbalit Rozbalit vše Re: C++ templaty, member function pointer
    Urcite, to neni hotovy kod, jen takovy napad.
    Sg1-game | We will destroys the Christian's legion ... and the cross, will be inverted | IP 80.188.182.6
    11.2. 10:36 Jardík
    Rozbalit Rozbalit vše Re: C++ templaty, member function pointer
    Používání výjimek na takovéto věci vidím jako zlo. Na programátorské chyby jsou asserty. Je ale smutné, že se místo nich ve standardní knihovně výjimky opravdu používají (třeba member fce at() různých kontejnerů).
    11.2. 10:37 Jardík
    Rozbalit Rozbalit vše Re: C++ templaty, member function pointer
    Jinak důvodem je samozřejmě rychlost. Assert zpomalí či zabrání inlinování a optimalizací jen v debug buildu, kdeždo výjimka může mít negativní dopad na inlinování a jiné optimalizace v release buildu.
    11.2. 14:42 Sten
    Rozbalit Rozbalit vše Re: C++ templaty, member function pointer
    Většina metod žádné výjimky nehází. at je hází úmyslně, neházející verze je operator [].

    GCC má debug verzi STL, která asserty obsahuje.
    11.2. 16:02 Jardík
    Rozbalit Rozbalit vše Re: C++ templaty, member function pointer
    Však nejsem blbej, já vím, že at() je hází úmyslně a taky vím, že operator[] ne. Ideální stav je, že je nehází ani at(), protože použití at() s neplatným indexem prostě považuji za programátorskou chybu a tedy by to mělo být ošetřeno assertem a né výjimkou. A operator[] by ten assert neměl obsahovat vůbec, aby nezdržoval debug build.
    10.2. 22:19 kverulant
    Rozbalit Rozbalit vše Re: C++ templaty, member function pointer
    IMHO tam nebudou fungovat implicitni konverze.
    11.2. 20:20 kverulant
    Rozbalit Rozbalit vše Re: C++ templaty, member function pointer
    A kdyz uz jsme u toho, tak to saskovani s vektorem je zbytecne. Typy argumentu jsou znamy v dobe prekladu, takze staci ulozit a porovnavat jen jeden slozeny typ, treba typeid(void(Ts...)) nebo neco podobneho.
    10.2. 23:46 Sten
    Rozbalit Rozbalit vše Re: C++ templaty, member function pointer
    Ten reinterpret_cast nebude fungovat na virtuální metody.

    Tohle se dělá tak, že při vytváření toho callbacku se uvnitř alokuje* šablonová implementace pro danou třídu mající virtuální metodu, kterou se to z operátoru () zavolá.

    * S trochou čachrování (placement new) to většinou lze alokovat i v prostoru vyhrazeném na zásobníku a ušetřit dynamickou alokaci.
    11.2. 00:06 Sten
    Rozbalit Rozbalit vše Re: C++ templaty, member function pointer
    Náčrt takového kódu (netestoval jsem, jestli funguje, ale pro ilustraci, jak by to mělo fungovat, snad stačí):
    
    template <typename ReturnT, typename... ParamTs>
    class Callback
    {
    protected:
        struct Iface
        {
            virtual ~Iface() {}
            virtual ReturnT operator ()(ParamTs... params) = 0;
        };
    
        template <typename Type>
        struct Impl
            : public Iface
        {
            using Func = ReturnT (Type::*)(ParamTs...);
    
            Impl(Type &obj, Func func)
                : obj(obj)
                , func(func)
            {}
    
            virtual ~Impl() {}
    
            virtual ReturnT operator ()(ParamTs... params)
            {
                return std::forward<ReturnT>(obj.*func(std::forward<ParamTs...>(params)));
            }
    
            Type &obj;
            Func func;
        };
    
        Iface& iface()
        {
            return *reinterpret_cast<Iface*>(buf);
        }
    
        size_t buf[4];
    
    public:
        template <typename Type>
        Callback(Type &obj,
                 typename Impl<Type>::Func func)
        {
            // Místo static_assert lze upravit, aby to použilo new
            static_assert(sizeof(Impl<Type>) <= sizeof(buf), "Buffer not large enough to capture callback");
            new (buf) Impl<Type>(obj, func);
        }
    
        ~Callback()
        {
            iface().~Iface();
        }
    
        ReturnT operator ()(ParamTs... params)
        {
            return std::forward<ReturnT>(iface()(std::forward<ParamTs...>(params)));
        }
    };
    
    Callback callback(t, &Type::getValueForInput);
    int value = callback(input);
    
    11.2. 00:14 Sten
    Rozbalit Rozbalit vše Re: C++ templaty, member function pointer
    Pár úprav:

    std::forward na návratové hodnoty je zbytečný, navíc nebude fungovat s void.

    virtual ReturnT operator ()(ParamTs... params) a virtual ~Impl()Impl by bylo lepší označit override.
    oryctolagus avatar 11.2. 08:53 oryctolagus | skóre: 29 | blog: Untitled
    Rozbalit Rozbalit vše Re: C++ templaty, member function pointer
    Jestli může být Callback templatová třída, pak se rovnou může použít std::function, ne?
    Existuje 10 druhů lidí: Ti, co nerozumí binární soustavě, ti, co ano, a ti, kteří znají i balancovanou ternární.
    11.2. 10:42 Jardík
    Rozbalit Rozbalit vše Re: C++ templaty, member function pointer
    Autor píše, že chce, aby všechny functory měly stejný typ a nebyly šablony. Musí to tedy být wrapper na nějaký objekt s virtual fcemi pro volání, nebo použít ošklivý cast. Jinak reinterpret_cast nemění žádné hodnoty, takže fungovat by měl, pokud to zpět castne na stejně veliký typ.
    11.2. 10:52 Jardík
    Rozbalit Rozbalit vše Re: C++ templaty, member function pointer
    Je to ale však prasárnička, o tom žádná. Ale nebude o nic větší, než moje prasárničky, kdy v pointeru vesele skladuju dalších 16 bitů nějakých hodnot, nebo používám double/NaN jako variant (hezky se tam vleze 47bit pointer, int, 47 bitů ze size_t, apod prasárničky, na dispatch tabulku máte celých 5 bitů).
    11.2. 14:38 Sten
    Rozbalit Rozbalit vše Re: C++ templaty, member function pointer
    OK, zkusím vymyslet, jak tohle nějak rozumně zabalit. Tuhle implementaci (operator ()) by šlo zabalit přes reinterpret_cast, protože není polymorfní (takže je to jen pointer na funkci, kde první parametr je this), ale nebude to ověřovat typy parametrů.

    Ten reinterpret_cast v původní implementaci nebude fungovat, pokud bude castovat z polymorfní třídy na nepolymorfní či obráceně, a nejspíš ani pokud bude mezi různými stromy polymorfních tříd, protože u virtuálních metod je to typicky implementováno jako index do vtable, nikoliv pointer.
    11.2. 16:39 Jardík
    Rozbalit Rozbalit vše Re: C++ templaty, member function pointer
    Jak vypadá ukazatel na member funkci vím, psal jsem to někde výše. Na x86-64 je to 2x8 bytů, v jednom je offset pro this pointer (kvůli vícenásobné dědičnosti apod) a druhý je pointer na metodu, popř. offset do vtable (na rozlišení se používá přičtení jedničky, při volání se testuje a podle toho se pak provede buď jump na tu adresu, nebo se fetchne z vtable). Pointery na virtuální i nevirtuální metodu stejné třídy stejné signatury musí být "kompatibilní". ve smyslu stejná velikost a stejný formát, jinak by se pointer nedal předat někam, kde se neví, jak se má zavolat. Na x86-64 jsou takto kompatibilní i pointery na member funkce různých tříd, samozřejmě včetně vícenásobné i virtuální dědičnosti.
    vlastikroot avatar 11.2. 15:53 vlastikroot | skóre: 24 | blog: vlastikovo | Milevsko
    Rozbalit Rozbalit vše Re: C++ templaty, member function pointer
    Jakto ze nebude fungovat? Muj kod virtualni metody pouziva, takze jsem je zkousel jako prvni. Chovalo se to tak jak bych ocekaval - kdyz vytvorim derived, pretypuju na base a udelam callback na base, volani spusti metodu v derived.
    Sg1-game | We will destroys the Christian's legion ... and the cross, will be inverted | IP 80.188.182.6
    11.2. 16:46 Jardík
    Rozbalit Rozbalit vše Re: C++ templaty, member function pointer
    Pokud použiješ reinterpret_cast na něco o stejné velikosti a pak na výsledek zase použiješ reinterpret_cast zpět na původní typ, tak to fungovat bude. Pouze se jinak interpretuje ta hodnota, ale nemění se. static_cast a dynamic_cast je na pointer na member funkci nepoužitelný, alespoň co já vím.
    vlastikroot avatar 13.2. 23:54 vlastikroot | skóre: 24 | blog: vlastikovo | Milevsko
    Rozbalit Rozbalit vše Re: C++ templaty, member function pointer
    Tak jsem to predelal podle Stenovych pripominek, na test parametru se pouziva dynamic cast. Tohle se zda o dost cistsi nez ty reintepret casty a zvenku se to chova stejne jako puvodni kod.
    class functor
    {
    protected:
        struct iface { virtual ~iface(){}; };
        template <typename... Ts> struct args : public iface
        {
            virtual void call(Ts...) = 0;
        };
    
        template <typename A, typename... Ts> struct impl : public args<Ts...>
        {
            A* obj;
            void (A::*func)(Ts...);
    
            impl(A* o, void (A::*f)(Ts...)) : obj(o), func(f) {}
    
            void call(Ts... args)
            {
                (obj->*func)(args...);
            }
        };
    
        size_t i[4];
    
    public:
        template<typename A, typename... Ts> functor(A* o, void (A::*f)(Ts...))
        {
            static_assert(sizeof(impl<A, Ts...>) <= sizeof(i), "Buffer not large enough to capture callback");
            new (i) impl<A, Ts...>(o,f);
        }
    
        template<typename... Ts> void operator()(Ts... params)
        {
            args<Ts...> *a = dynamic_cast<args<Ts...>*>(reinterpret_cast<iface*>(i));
    
            if(a) a->call(params...);
            else qDebug() << "bad parameters";
        }
    };
    
    Sg1-game | We will destroys the Christian's legion ... and the cross, will be inverted | IP 80.188.182.6

    Založit nové vláknoNahoru

    Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

    ISSN 1214-1267   www.czech-server.cz
    © 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.