Invalid Heap Pointer nach Aufruf von new char[]



  • Wie soll ein String mit < 16 Zeichen keine Allokation benötigen?



  • 314159265358979 schrieb:

    Wie soll ein String mit < 16 Zeichen keine Allokation benötigen?

    Der std::string von msvc++ hat halt intern ein char buffer[16] . Erst wenn der voll ist wird der heap bemüht.



  • Was für ne Verschwendung oO


  • Mod

    314159265358979 schrieb:

    Was für ne Verschwendung oO

    Du verstehst nicht. Das ist kein zusätzliches Array. Stell dir eine Art union vor. Wenn die Stringlänge kleiner ist als die internen Verwaltungsdaten des Strings, dann werden diese Daten wie ein char[] benutzt. Wird der String länger, schaltet er um auf Datenfeld im Heap.



  • Achso, okay. Das ist was anderes. Interessanter Trick.



  • SeppJ schrieb:

    314159265358979 schrieb:

    Was für ne Verschwendung oO

    Du verstehst nicht. Das ist kein zusätzliches Array. Stell dir eine Art union vor. Wenn die Stringlänge kleiner ist als die internen Verwaltungsdaten des Strings, dann werden diese Daten wie ein char[] benutzt. Wird der String länger, schaltet er um auf Datenfeld im Heap.

    Interessant. Ich war davon ausgegangen, dass sie mindestens den data_begin und data_end ptr auf jeden Fall auch bei kleinen strings behalten würden, um operator[], begin und end möglichst effizient zu halten. Weißt du was die intern genau machen? (habe den vc++ nicht mehr installiert)


  • Mod

    GorbGorb schrieb:

    Interessant. Ich war davon ausgegangen, dass sie mindestens den data_begin und data_end ptr auf jeden Fall auch bei kleinen strings behalten würden, um operator[], begin und end möglichst effizient zu halten. Weißt du was die intern genau machen? (habe den vc++ nicht mehr installiert)

    Wie das nun haargenau ist, weiß ich nicht und ich kann's ebenfalls nicht nachschauen. Gut möglich, dass du Recht hast.



  • Zum Thema standard libraries würde ich noch anmerken, dass die nicht immer besonders effizient geschrieben sind. Mein MinGW mit gcc 4.6 macht zum Beispiel keine small object optimization bei std::function, obwohl sizeof( std::function<...> ) genauso groß ist wie bei boost::function. (das ist finde ich echt ein Ärgernis... die hätten doch einfach die Version von boost übernehmen können)



  • GorbGorb schrieb:

    Zum Thema standard libraries würde ich noch anmerken, dass die nicht immer besonders effizient geschrieben sind. Mein MinGW mit gcc 4.6 macht zum Beispiel keine small object optimization bei std::function, obwohl sizeof( std::function<...> ) genauso groß ist wie bei boost::function. (das ist finde ich echt ein Ärgernis... die hätten doch einfach die Version von boost übernehmen können)

    Wie sieht diese Optimierung denn aus?


  • Mod

    TyRoXx schrieb:

    Wie sieht diese Optimierung denn aus?

    Das ist ziemlich genau das gleiche wie die oben beschriebene small string optimization.


Anmelden zum Antworten