Odpovídáte na názor ke článku Alokátory a operator new v C++.
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::vector<int> > *k = new(myalloc) TDynObject<std::vector<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ú)
Intenzivně se zabývám programováním zejména v jazyce C++. Vyvíjím vlastní knihovny, vzory, techniky, používám šablony, to vše proto, aby se mi usnadnil život při návrhu aplikací. Pracoval jsem jako programátor ve společnosti Seznam.cz. Nyní jsem se usadil v jednom startupu, kde vyvíjím serverové komponenty a informační systémy v C++
Přečteno 51 314×
Přečteno 24 095×
Přečteno 22 931×
Přečteno 21 166×
Přečteno 17 872×