2012-03-27 7 views
8

Der C-Standard erlaubt bestimmte Optimierungen von Strukturen nicht: 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 usw. Dies wird aus verschiedenen Gründen benötigt, einschließlich konsistenter Strukturlayouts über die Kompilierungseinheiten hinweg und um Cast-kompatible Strukturen zu ermöglichen.C-Compiler-Strukturoptimierung

Sie alle modernen Compiler (zum Beispiel gcc, Klirren, Visual C) Verlängerungen, die mir erlauben, es zu sagen, dass es in Ordnung ist, diese Optimierungen zu tun?

Natürlich würden sie nur für Definitionen Sinn machen, die lokal für eine einzelne Kompilierungseinheit waren, so dass der Compiler alle möglichen Verwendungen der Struktur sehen konnte; 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 eine -fipa-struct-reorg Option haben verwendet, um dies zu ermöglichen, genau, aber es funktionierte nicht sehr gut und etwas verfaulen, und wurde schließlich herausgenommen. Aber ich weiß nicht, ob es durch irgendetwas ersetzt wurde. Und ich konnte nichts in clang finden, was mich überrascht, weil ich denken würde, dass dies genau die Art von Optimierung ist, die überall klingeln würde ...

+0

Wäre es möglich, solche Dinge zu optimieren? –

+1

Es * könnte * helfen, wenn Sie geben Strukturvariablen Speicherklasse 'Register', die erzwingt, dass Sie nicht auf Speicherlayout auf einer Sprachebene verlassen; aber der Optimierer sollte das herausfinden können, unabhängig von der Anwesenheit von "register", und ich habe keine Ahnung, ob es etwas in der Praxis macht ... – Christoph

+0

Funktioniert leider nicht, aber einen Versuch wert --- ta. ('Register' ist für Strukturelemente oder statische Variablen nicht gültig und scheint bei automatischen Variablen ignoriert zu werden.) –

Antwort

4

Nein. Es gibt keinen Grund für solch ein Ding geliefert werden.

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

  2. Wenn Sie die Analyse ausführen können, die erforderlich ist, um Strukturelemente zu kennzeichnen, "dies kann optimiert werden, wenn es nicht verwendet wird" (Vorsicht funky Offset-Berechnung von Makros), 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, kommentieren Sie es einfach und sehen Sie, ob Sie einen Kompilierungsfehler bekommen.

+0

Nun, sicher, aber das ist nicht wirklich relevant --- Ich habe nicht nach statischen Analysen gefragt und Wie ich in der ursprünglichen Frage gesagt habe, bin ich durchaus bereit, Situationen zu vermeiden, in denen die Optimierung der Strukturen den Code sprengen würde. –

+1

@DavidGiven, ich habe Mühe, an einen Anwendungsfall für dieses Feature zu denken. Meine Antwort ist, dass es keine gibt, weshalb es nicht angeboten wird. Wenn Sie einen haben, fügen Sie ihn der Frage hinzu. – Ben