簡體   English   中英

在gcc編譯器中禁用特定的優化(消除死代碼)

[英]Disabling specific optimization(Dead code elimination) in gcc compiler

我想在C ++編譯中禁用死代碼消除優化。 有沒有一種方法可以通過保留所有其他-O優化來禁用此特定優化。 我嘗試使用-fnodce,但無法正常工作。

更新 (從評論中復制):我有類似

timer t;
t.start();
for(int i=1;i<=1000;++i)
    object t;
t.stop();

我想測量對象t構建時間,而對其不執行任何操作。 我不想通過創建1000個對象的數組來做到這一點。 有辦法解決嗎?

在構造的對象上添加“易失”限定符,這告訴編譯器假定構造存在副作用,因此阻止了對其進行優化。 那是:

timer t; 
t.start(); 
for(int i=1;i<=1000;++i) 
  volatile object t; 
t.stop(); 

好吧,如果您只是想測量對象的初始化時間,為什么要強迫編譯器避免DCE和諸如此類的事情,而不是僅僅以避免問題的方式編寫它?

object *arr = new object[100];   // allocate that outside the function and pass it into it
for (int i = 0; i < 100; i++) {
    arr[i] = new object;
}

如果函數足夠大,可以避免內聯,那么就可以解決問題-否則,您可以導出函數並從另一個編譯模塊調用它,以避免不必要的優化。 簡單,沒有帶有某些編譯器標志的技巧,可能會帶來意想不到的后果,並且唯一的開銷就是數組存儲-如果可測量地影響您的時間,那么無論如何您都在測量錯誤的東西。

或者,如果您真的想要一些編譯器特定的標志-gcc具有noinline屬性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM