Warum nicht den GCC optimieren, Strukturen?
Systeme verlangen, dass bestimmte primitive ausgerichtet werden, um bestimmte Punkte innerhalb des Speichers (int bytes, die ein Vielfaches von 4, - shorts bytes, die ein Vielfaches von 2, etc.). Natürlich, diese optimiert werden können, um Abfälle, die am wenigsten Platz in der Polsterung.
Meine Frage ist nicht warum GCC das automatisch? Ist das mehr offensichtlich Heuristik (um Variablen von der größten Größe Anforderung zum kleinsten) fehlt in irgendeiner Weise? Ist ein code abhängig von der physikalischen Reihenfolge Ihrer structs ist, dass eine gute Idee)?
Ich bin nur Fragen, weil GCC ist super optimiert, in vielerlei Hinsicht, aber nicht in diese ein, und ich denken, es muss eine relativ kühle Erklärung (zu denen auch ich bin blind).
- Sie können versuchen, die
-fipa-struct-reorg
option in der struct-reorg-Zweig. gibt es eine GCC-Schlüsselwort zu erlauben, Struktur-Neuordnung?
Du musst angemeldet sein, um einen Kommentar abzugeben.
gcc nicht die Reihenfolge der Elemente einer struct, denn das würde gegen den C-standard. Abschnitt 6.7.2.1 der C99-standard besagt:
Strukturen werden Häufig als Darstellungen der Verpackung, um von binären Dateiformaten und Netzwerkprotokollen. Diese würde brechen, wenn die getan wurden. Zusätzlich, verschiedene Compiler optimieren würde, die Dinge anders und Verknüpfung von code, der gemeinsam von beiden unmöglich sein würde. Dies ist einfach nicht machbar.
GCC ist schlauer als die meisten von uns in der Herstellung von Maschinen-code aus unserem source code, aber ich zittern, wenn es war klüger, als uns in der re-Organisation unserer Strukturen, da es die Daten können z.B. in eine Datei geschrieben werden. Eine Struktur, die beginnt mit 4 chars und hat dann eine 4-byte integer wäre sinnlos, wenn Sie Lesen, auf einem anderen system, wo GCC beschlossen, dass es re-ordnen Sie die strukturmember.
gcc SVN hat eine Struktur, Reorganisation, Optimierung (-fipa-struct-reorg), aber es erfordert whole-program-Analyse und ist nicht sehr mächtig im moment.
C-Compiler nicht auch automatisch das pack structs gerade weil von alignment-Probleme wie die, die Sie erwähnen. Greift nicht auf Wortgrenzen (32-bit-auf den meisten CPUs) tragen schwere Strafe auf x86 und verursachen tödliche fallen, die auf RISC-Architekturen.
Nicht sagen, es ist eine gute Idee, aber man kann sicherlich schreiben code, der abhängig von der Reihenfolge der member einer struct. Zum Beispiel, wie ein hack, die oft Menschen werfen einen Zeiger auf eine struct als Typ der ein bestimmter Bereich im inneren, die Sie zugreifen möchten, dann verwenden Sie Zeiger-Arithmetik, um dorthin zu gelangen. Für mich ist das eine ziemlich gefährliche Idee, aber ich habe es verwendet, vor allem in C++ zu zwingen, eine variable, die deklariert wird, private und öffentlich zugänglich, wenn es in einer Klasse von einem 3rd-party-Bibliothek und ist nicht öffentlich gekapselt. Neuanordnen der Mitglieder würde ganz brechen, die.
Möchten Sie vielleicht zu versuchen, die neueste gcc-trunk-oder struct-reorg-Zweigstelle, die unter aktiver Entwicklung.
https://gcc.gnu.org/wiki/cauldron2015?action=AttachFile&do=view&target=Olga+Golovanevsky_+Memory+Layout+Optimizations+of+Structures+and+Objects.pdf