C-Compiler-Strukturoptimierung

8

Der C-Standard lässt bestimmte Optimierungen von Strukturen nicht zu: z. B. Neuanordnung von Feldern, Zusammenführen von Feldern, Verwerfen von Feldern, von denen nie gelesen wird, Herausheben von Feldern aus der Struktur, wenn sie in automatische Variablen umgewandelt werden können wird aus verschiedenen Gründen benötigt, einschließlich konsistenter Strukturlayouts über die Kompilierungseinheiten hinweg und ermöglicht Cast-kompatible Strukturen.

Unterstützen moderne Compiler (z. B. gcc, clang, Visual C) Erweiterungen, mit denen ich sagen kann, dass es ist , diese Optimierungen durchzuführen?

Natürlich würden sie nur für Definitionen Sinn machen, die für eine einzelne Kompilierungseinheit lokal sind, so dass der Compiler alle möglichen Verwendungen der Struktur sehen könnte; und bestimmte Dinge (wie die oben genannten Cast-kompatiblen Strukturdefinitionen) würden unbrauchbar werden. Aber für bestimmte Aufgaben könnte dies eine sehr wertvolle Optimierung sein.

Ich weiß, dass gcc used eine Option -fipa-struct-reorg hat, um genau dies zu erlauben, aber es hat nie sehr gut funktioniert und verrottet und wurde schließlich herausgenommen. Aber ich weiß nicht, ob es durch irgendetwas ersetzt wurde. Und ich konnte nichts im Klang finden, was mich überrascht, weil ich denken würde, dass dies genau die Art von Optimierung ist, die überall klingeln würde ...

    
David Given 27.03.2012, 21:37
quelle

1 Antwort

4

Nein. Es gibt keinen Grund dafür, dass so etwas geliefert wird.

  1. Sie können es nicht tun, wenn die Adresse der Struktur irgendwo hingenommen und gesendet wird, da sie sowieso Alias ​​sein könnte. Das schließt praktisch alles außerhalb einer einzigen Funktion aus.

  2. Wenn Sie die Analyse durchführen können, die erforderlich ist, um Strukturelemente zu kennzeichnen, dass "dies optimiert werden kann, wenn sie nicht verwendet wird" (Vorsicht funky offset accounting macros), dann können Sie selbst sehen, ob es benötigt wird oder nicht und nimm es selbst raus.

  3. Wenn Sie sich nicht sicher sind, sagen Sie es einfach aus und sehen Sie, ob Sie einen Kompilierungsfehler bekommen.

Ben 27.03.2012 23:01
quelle