2017-05-27 65 views
-1

一般來說,如果由關鍵字auto推導的類型對於編譯器優化級別是不變的?或者,如果g++ -O3g++ -g(例如,導致針對同一行代碼的`auto'關鍵字導致不同類型,它是否與語言標準一致?具有編譯器優化級別的C++`auto'關鍵字的行爲

我有一個函數,調用它FUNC(),它返回一個uint8_t而且我發現,如果我這樣做:

auto val = func(); 

然後VAL爲uint8_t沒有優化和一個4字節的結束鍵入(如此,顯然uint32_t)與優化。

相關的問題,因爲我不能做sizeof()函數的返回類型...我能做些什麼來獲得不受編譯器優化影響的函數返回類型的大小?

+1

不,這些是完全正交的機制。請給我們一個[MCVE]來證明這一點。 –

+0

你可以創建一個[mcve]來表示這個請。 –

+0

@πάντα根據OP的問題,顯然不是。 –

回答

0

要查找函數的返回類型的大小,請將函數的參數類型爲sizeof(本例中爲null)。

所以,你的情況,你會發現返回類型的大小:

你甚至可以把一個斷言,以檢查返回值是你所期望的一個 - 例如,以檢查超載是否按預期工作:

static_assert(std::is_same<decltype(func()), int>::value, 
    "func has incorrect return value"); 
+0

發射的組件可能與此不同。我正在考慮緩存內容優化等。讓OP先澄清一下,然後再回答。 –

+0

「std :: result_of」的第一個參數必須是一個類型,而'func()'不是。你可以做'sizeof(func())'(它不會調用'func')。 'sizeof(func)'是不合格的,不是未定義的行爲。 – aschepler

+0

Yikes,你說得對。我把'invoke_result'與'result'混淆了。現在修復它。 – rsjaffe