2013-04-18 142 views
3

我在構造函數或類Valuable中有一些有用的代碼。我想確保它在submain之前執行。我怎樣才能保證它沒有被優化出來?C++:避免​​優化變量

int main() 
{ 
    // Dear compiler, please don't optimize ctor call out! 
    Valuable var; 

    return submain(); 
} 

局部變量是否足夠?我是否需要使用static

static Valuable *v = new Valuable(); 
delete v; 
v = NULL; 

我能縮短之前的一個班輪:

delete new Valuable(); 
+2

讓它變成'volatile'。或者我應該甚至建議..? – 0x499602D2

+3

如果你的構造函數有副作用,那麼它將不會被優化,除非它是一個拷貝構造函數,在這裏不是這種情況。如果你的構造函數沒有副作用,那麼你將無法判斷它是否被優化了,所以它沒有任何區別。 –

+0

你試過揮發? – derpface

回答

12

如果你的構造函數和析構函數有可觀察的行爲,編譯不允許優化它。所以不需要做任何棘手的事情。

+0

如果副作用在析構函數中會怎樣?實際上這個第三方類在析構函數中初始化靜態互斥鎖,這就是爲什麼它在這裏。 – demi

+0

在這種情況下,小心使用「副作用」一詞(與「可觀察行爲」相反)似乎很有用:http://stackoverflow.com/a/8287110/777186 – jogojapan

+1

@demi:不,在這種情況下,編譯器也不允許優化對象。編譯器必須確保程序的行爲與由C++語言標準指定的抽象狀態機的行爲相同。標準允許構造函數被刪除的唯一時間是兩個非常特殊的情況,包括複製構造函數(從函數返回非易失性自動對象並複製某些未綁定的臨時對象);請參閱C++ 03§12.8/ 15。 –