2012-04-08 21 views
26

mit diesem Code:Warum ist std :: list auf C++ 11 größer?

#include <iostream> 
#include <list> 

int main() { 
    std::cout << sizeof(std::list<void*>) << std::endl; 
}; 

konnte ich, dass 4.7 die Größe std::list<void*> auf 98 C auf GCC bemerken ++ ist 16 Bytes, und seine Größe auf 11 C++ ist 24 Bytes.

Ich habe mich gefragt, was sich auf std :: list geändert hat, das es größer gemacht hat.

+12

Aus technischer Sicht ist dieses Verhalten vollständig implementierungsspezifisch. Die Bibliotheksautoren könnten, wenn sie möchten, willkürlich entscheiden, die Klasse ohne jede Rechtfertigung größer zu machen. Es ist wahrscheinlich keine gute Idee, irgendeinen Code zu schreiben, der von der Größe einer Liste abhängt, die genau 16 Bytes ist; Was hast du gemacht, wo das tatsächlich einen Fehler verursacht hat? – templatetypedef

+0

Werfen Sie einen Blick auf hier: http://en.cppreference.com/w/cpp/container/list Sie werden sehen, einige Mitgliedstypen in C++ 11 in Std :: Liste geändert haben. – dexametason

+3

Wahrscheinlich haben sie die Listengröße zwischengespeichert. 24 Bytes sind drei 64-Bit-Werte - ein Startzeiger, ein Endzeiger und eine Größe. – Borealid

Antwort

41

C++ 11 erfordert list::size() zur Ausführung in konstanter Zeit. GCC machte dies möglich durch adding the size as a data member. GCC hat dies für den C++ 98-Modus nicht getan, da dies die Binärkompatibilität beeinträchtigen würde.

Mischen Sie nicht den im C++ 98-Modus kompilierten Code mit im C++ 11-Modus kompiliertem Code. Es funktioniert nicht.

aktualisieren: offenbar, die GCC-Leute hatte eine Veränderung des Herzens und C++ 11-Konformität ist weniger wichtig als jetzt für die Kompatibilität beibehalten wird, so wird list::size() nicht mehr in konstanter Zeit in GCC 4.7.2 auszuführen. Es wird in einer zukünftigen Version sowohl in C++ 98 als auch in C++ 11 Modi sein.

+2

Was ist die Komplexität von 'std :: list :: splice', jetzt? –

+0

@ André: Es hängt davon ab, welche Überlast Sie anrufen. Einige Überladungen sind O (1), einige sind O (N). – ildjarn

+0

Sie müssen das Größenfeld aktualisieren, daher müssen Sie die Anzahl der Elemente zählen, auf die von den Iteratoren verwiesen wird. –

Verwandte Themen