Update: Das folgende Problem hängt anscheinend von der Option -fwhole-program
ab.
Ich habe ein bisschen mit der Speicherzuweisung herumgespielt und bin dabei auf ein kleines Rätsel gestoßen: In GCC (4.6), wie reserviert std::string
seinen Speicher [ editieren ] beim Kompilieren -fwhole-program
[/]?
Habe folgendes Testprogramm:
%Vor% Wenn ich einen anderen dynamischen Container verwende (der std::allocator<T>
verwendet), verwendet der Allokator ::operator new
, und so sehe ich die Debug-Nachrichten glücklich. Mit std::string
sehe ich jedoch überhaupt nichts. Ich bin mir sicher, dass dynamische Zuweisung geschieht, wie ich mit valgrind bestätigen kann (13 plus String-Länge Bytes sind zugeordnet). Ich ging durch mehrere Quelldateien und den Standard, und ich bin ziemlich sicher, dass die Vorlage std::basic_string<T, std::char_traits<T>, std::allocator<T>>
ist, so dass ich nicht weiß, warum ich die Nachrichten von meinen ersetzten Zuordnungsfunktionen nicht sehe.
Kann jemand dieses Rätsel aufklären? Was mache ich, um String-Zuordnungen zu verfolgen? Könnte irgendjemand dies durch irgendeinen anderen Compiler ausführen und sehen, ob es irgendeine Ausgabe erzeugt?
(Beispiel: Wenn ich std::map<int, int> m { { 0, 1 } };
hinzufüge, habe ich die Ausgabe new() requests 24 bytes, allocated at 0x8d53028
etc.)
Betrachtet man die Ausgabe von g++ ... -S
mit / ohne -fwhole-program
so scheint es, dass die gesamten benutzerdefinierten new / delete-Operatoren überhaupt nicht ausgegeben werden, wenn fwhole-program
verwendet wird.
Ich fange an zu vermuten, dass wir hier einen Fehler sehen.