Je to velmi dobre IDE, ale ten framework ma stejno chybu jako Qt: pouziva _zase_ nove tamplates (string, map...). To se mam ucit 69 verzi stringu? me se zda std::string naprosto dostatecny.
No, ono to ma duvod. std::string je bohuzel naopak naprosto nedostatecny, prakticky se neda pouzit vubec na nic. Coz pak vede k takovym nesmyslnym doporucenim jako pouzivat std::vector na sestavovani retezcu (protoze std::string je prilis pomaly) atd...
std::string (std::map, std::set...) pouzivam uz radu let a zatim jsem si nevsim ze by byly na nic, ani jsem nezaznamenal lepsi variaci na toto tema. Zajima me ktere operace se std::stringem jsou tak pomale a kterak to lze v jine implementaci napravit?
Obecne append a copy contructor. Problem je spis v tom, ze standard nedefinuje jejich slozitost - a zaroven definuje interface tak, ze je implementace pomoci "copy-on-write" pocitani referenci neni mozna ci vyhodna. std::string tak vicemene pri kazde kopii musi kopirovat cely vnitrek. Vzhledem k tomu, ze my radi String pouzivame pro binarni data, je takova implementace znacne nevyhodna. Problem s append je v tom, ze implementace obvykle rozsiruji alokovany prostor presne o tolik bytu, kolik je potreba. Coz znamena, ze pokud skladate std::string znak po znaku, pro kazdy se kopiruje cely vnitrek.
Napravit to lze tak, ze se pouzije interface umoznujici reference counting a append se udela s rezervou (cili alokuje podstatne vic mista, takze dalsi append uz nemusi alokovat/kopirovat nic). Pro pripad ze je potreba minimalizovat pamet, je tam metoda Shrink (uvolni nadbytecne misto).
To se asi da, ale jednak musite vedet ci zjistovat kolik, ale hlavne v konecnem dusledku tak zacnete obchazet mizerne udelany interface.
Ja od Stringu ocekavam minimalne dve veci - ze jeho kopii dostanu v konstatnim case a ze ho muzu vzdy pouzit ke spojovani retezcu, vcetne treba skladani znak po znaku a nemusim se starat o to ze by to bylo pomale. Bohuzel, ani v jedne z techto veci mi std::string nijak nepomuze.
Problém je ten, že potřebujeme získat hashovací hodnotu z pointeru na metodu, jinak řečeno vlastně adresu metody vyjádřenou jako unsigned. Bohužel, C++ tady jaksi nedává žádnou jinou možnost jak toho dosáhnout....
Mimochodem, pokud by to bylo implementované jako return 0, v podstatě by se kromě jistého zpomalení taky nic nestalo, jediné co by mělo být zajištěno aby pro stejnou metodu (S source) to vracelo stejné číslo (což nakonec 0 splňuje).
Jinak evidentně je tahle konverze teoreticky nepřenositelná, no tak je to aspoň zapouzdřené v šabloně s nápadným jménem....
Jinak mimo Callback.h se tato ošklivost nepoužívá.