Frage

Systems verlangen, dass bestimmte Primitive auf bestimmte Stellen innerhalb des Speichers (INTs in Bytes, die ein Vielfaches von 4, Kurzschlüsse zu Bytes sind, die ein Vielfaches von 2 sind, etc.) ausgerichtet werden. Natürlich können diese den geringsten Raum in padding verschwenden optimiert werden.

Meine Frage ist, warum GCC dies nicht automatisch tun? Sind offensichtliche heuristische (um Variablen aus größter Größe Anforderung kleinsten) in irgendeine Weise fehlt? Ist ein Code abhängig von der physikalischen Anordnung ihrer structs (ist das eine gute Idee)?

Ich frage nur, weil GCC Super in vielerlei Hinsicht optimiert ist, aber nicht in diesem, und ich denke, es muss eine relativ kühle Erklärung sein (auf die ich bin blind).

War es hilfreich?

Lösung

gcc nicht neu anordnen, die Elemente einer Struktur, denn das ist die C-Standard verletzen würde. Abschnitt 6.7.2.1 der C99-Standard ist:

  

Innerhalb eines Strukturobjekts, die nicht-bit- Feldelemente und die Einheiten, in denen bitweisen Feldern   haben residieren-Adressen, die in der Reihenfolge zu erhöhen, in der sie deklariert ist.

Andere Tipps

Structs werden als Darstellungen der Packordnung von binären Dateiformaten und Netzwerkprotokollen eingesetzt. Dies würde brechen, wenn das erledigt wurde. Darüber hinaus würden verschiedene Compiler die Dinge anders optimieren und die Verknüpfung Code gemeinsam von beiden wäre unmöglich. Dies ist einfach nicht möglich.

GCC ist intelligenter als die meisten von uns in Maschinencode aus unserem Quellcode erzeugen; aber ich zittere, wenn es klüger als wir war in unserer structs Neuanordnung, da es Daten ist, dass zum Beispiel kann in eine Datei geschrieben werden. Eine Struktur, die mit 4 Zeichen beginnt und dann hat ein 4-Byte-Integer nutzlos wäre, wenn auf einem anderen System gelesen, in denen GCC entschieden, dass es die Strukturkomponenten neu ordnen sollte.

gcc SVN hat eine Struktur Reorganisation Optimierung hat (-fipa-struct-Reorg), aber es erfordert Vollprogrammanalyse und ist nicht sehr stark im Moment.

C-Compiler nicht automatisch verpacken structs gerade weil von Ausrichtungsproblemen wie Sie erwähnen. Greift nicht auf Wortgrenzen (32-Bit auf den meisten CPUs) tragen schwere Strafe auf x86 und verursachen tödliche Fallen auf RISC-Architekturen.

sagt nicht, es ist eine gute Idee, aber man kann sicherlich Code schreiben, der in der Größenordnung der Mitglieder einer Struktur beruht. Zum Beispiel, wie ein Hack, warfen die Menschen oft einen Zeiger auf eine Struktur wie die Art eines bestimmten Feldes im Innern, dass sie den Zugang will, dann Zeigerarithmetik verwendet um dorthin zu gelangen. Für mich ist dies eine ziemlich gefährliche Idee, aber ich habe es verwendet gesehen, vor allem in C ++ eine Variable zu erzwingen, die privat deklariert worden ist öffentlich zugänglich zu sein, wenn es in einer Klasse aus einer 3rd-Party-Bibliothek und ist nicht öffentlich verkapselt. die Mitglieder Neuordnen wäre das völlig brechen.

Sie möchten die neueste gcc Stamm oder struct-Reorg-Zweig, um zu versuchen, die unter aktiver Entwicklung ist.

https://gcc.gnu.org/wiki/cauldron2015?action=AttachFile&do=view&target=Olga+Golovanevsky_+Memory+Layout+Optimizations+of+Structures+and+Objects.pdf

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top