2012-03-27 110 views
8

C標準不允許對結構進行某些優化:例如,重新排列字段,合併字段,丟棄永遠不會讀取的字段,如果字段可以變成自動變量等等,這是由於各種原因需要的,包括跨編譯單元的一致的結構佈局以及允許與演員兼容的結構。C編譯器結構優化

是否有任何現代編譯器(例如gcc,clang,Visual C)支持擴展,允許我告訴它它可以做這些優化嗎?

當然,它們只適用於單個編譯單元本地的定義,以便編譯器可以看到該結構的所有可能用法;和某些東西(如前述的與演員兼容的結構定義)將變得無法使用。但對於某些任務,這可能是一個非常有價值的優化。

我知道,GCC 用於-fipa-struct-reorg選項允許正是這個,但是它從來沒有工作非常好,有點腐爛,並最終被取出。但我不知道它是否被任何東西取代。我一直沒能找到任何東西在叮噹中,這令我感到驚訝,因爲我認爲這正是鏗鏘聲將會全部結束的最優化類型...

+0

-flto能夠優化這樣的事情嗎? – 2012-03-27 21:45:36

+1

如果你給結構變量存儲類「register」,它*可能會有所幫助,這會強制你不依賴於語言級別的內存佈局;然而,優化器應該能夠弄清楚,無論是否存在「註冊」,我不知道它是否在實踐中有任何區別... – Christoph 2012-03-27 22:42:56

+0

不幸的是,不值得一試--- TA。 ('register'在結構成員或靜態變量上無效,並且在自動變量上似乎被忽略。) – 2012-03-28 11:07:15

回答

4

不,沒有理由這樣要提供的東西。

  1. 如果結構地址被取走併發送到任何地方,無論如何它可能會被別名,您無法做到這一點。這幾乎排除了單個函數之外的任何事情。

  2. 如果你可以通過並做標記結構成員所需的分析「如果不使用它可以優化掉」(注意時髦偏移量計算宏),那麼你可以自己看看是否需要,並自己拿出來。

  3. 如果不確定,只需將其註釋掉,看看是否出現編譯錯誤。

+0

嗯,當然,但這並不真正相關---我沒有問靜態分析,正如我在原始問題中所說的那樣,我已經準備好避免優化結構會破壞代碼的情況。 – 2012-03-28 11:16:00

+1

@DavidGiven,我正在努力想到這個功能的用例。我的答案基本上是沒有一個,這就是爲什麼它沒有提供。如果有,請將其添加到問題中。 – Ben 2012-03-28 11:34:30