Odpověď na názor

Odpovídáte na názor ke článku Alokátory a operator new v C++.

  • 6. 9. 2012 9:08

    Ondřej Novák (neregistrovaný)

    Dobře, tak to vypadá, že vidíme stejné problémy, ale hledáme jiná řešení. Já si s tím hraju už poměrně dlouhou a tohle je zatím systém, který se mi nejvíc osvědčil. Prošel jsem si cestou, kterou máte shrnuté v bodech přesně v tom pořadí.
    * Používal jsem továrny a kopírovací konstruktory.
    * Řešil instanciovatelnost stl alokátorů (a našel takové podivnosti, jako allocator::rebind, které hojně využívají STL kontejnery - takové nečekané překabátění allokátorů, které se jinak má řešit pomocí dvojice tříd = hlavní instance alokátoru, který umí vytvořit specifický alokátor ke konkrétnímu T)
    * Pak zápasení s velikostí objektu. Destrukce objektu "in-place" znám už dlouho a funguje to i na virtuální destruktor, ale jak zjistit velikost toho objektu, to nejde
    * Jak zjistím začátek objektu? dynamic_cast<void *> (co když máte vypnuté RTTI? co když tomu předložíte objekt, který nemá z principu RTTI záznam, třeba třídu s nevirtuálními funkcemi). Jo, vím, že boostu na to mají nějakou "elektrárnu"

    Ohledně z praseného kódu, trochu si rejpnu do STL, jako žo ho celý považuju za zprasený (podívejte se někdy dovnitř. Proč třeba std::string řeší aktuální jazykovou stránku operačního systému? - MSVC). Takže STL nevyužívám, pakliže mi to někdo nedá příkazem. Určitě i new a delete by se daly vymyslet lépe, ale tam já už jako uživatel jazyka moc nezmůžu. Dokud překladač nebude zvládat genericky varargs a s nimi související perfect forwarding (to sice C++11 umí, ale je to opět velice "nehezké" a nezvládá ty varargs), tak si s new prostě musíme vystačit. Ony ty kopírovací konstruktory v továrnách jsou dost rušivé. Některé objekty zpravidla nemají kopírovací konstruktory, protože to postrádá smysl. Zkuste třeba zkopírovat síťové spojení. Takže i já občas do dokumentace píšu, že kopírovací konstruktor kopíruje pouze "setup" objektu, nikoliv jeho aktuální stav.

    K tomu závěru. Lidé zblblí STLkem - oficiálně standardem, ale u mě spíš "doporučením" (a ještě k tomu mizerným) při použití slova "alokátor" okamžitě vidí std::allocator a přes to vlak nejede. Já mám ale opravdu na mysli obecné alokátory, tedy objekty, které zajišťují alokaci paměti. Takže název článku je správně. Je to i o alokátorech (ne o std::allocatorech)

    PS:

    template class TDynObject: public T, public DynObject {...};
    TDynObject<std::vec­tor<int> > *k = new(myalloc) TDynObject<std::vec­tor<int> >;

    Jo, forwarding parametrů konstruktoru u TDynObject je opět obligátní problém. Ale dá se to pořešit v rozumé míře (do 8 argumentú)