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 ...
Wäre es möglich, solche Dinge zu optimieren? –
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
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.) –