如組件(CALL指令)看到的constexpr是不是在編譯時評估的評估,爲什麼呢?
(使用附帶的碼塊(克++ 4.7.1最近GCC)與-std = C++ 11)
如組件(CALL指令)看到的constexpr是不是在編譯時評估的評估,爲什麼呢?
(使用附帶的碼塊(克++ 4.7.1最近GCC)與-std = C++ 11)
constexpr
不保證編譯時評估。它只保證constexpr
,當編譯時常量輸入本身解析爲編譯時常量。
在這種情況下,編譯器選擇不評估getOdd(7)
,儘管它可能有。 (注意,getOdd
本身不是constexpr
,即使isEven
是。)
編譯器可能會選擇優化和內聯,例如,增加優化級別。但這與constexpr
無關。
是的,就像Dietmar寫的,即使我將getOdd聲明爲constexpr,它仍然沒有優化。當我提高我的優化級別時,它確實如此。謝謝:) – Oded
你getOdd()
不是constexpr
和編譯器當然不需要通過傳播常量表達式非constexpr
功能。另外,您是否啓用了優化進行編譯?沒有優化,編譯器往往不會做任何otimizations。
g ++ -O3將在編譯時評估表達式。
請注意,簡單的getOdd實現將返回t | 1
。
謝謝,很好的答案,但不是非常詳細的喬Z的。 和t | 1,我知道,但我想測試constexpr機制。 – Oded
注意一個更簡單的方法來檢查它在編譯時完成是一個靜態斷言。 – chris
我並不知道低聲譽會阻止您將代碼放入問題中...... –