[問題] constexpr觀念釐清

作者: lovejomi (JOMI)   2019-02-06 11:14:02
http://www.modernescpp.com/index.php/c-core-guidelines-programming-at-compile-time-with-constexpr
https://bit.ly/2TwXrG9
看完這篇有幾個觀念想討論~
1. 他提到 constexpr function預設是inline, 意思是說假設用在runtime的情境下
會"建議" compiler用inline的方式對吧?
這邊衍伸一個問題是
https://stackoverflow.com/a/4193698
為什麼inline function寫在header 不會有redefine的error, 而一般函數卻會?
兩個應該都是external linkage, 為什麼一個會用ODR去解釋一個就是redefine?
ODR我經驗上是 有兩個class同名 member function又剛好都呼叫同一個名字的
compiler只會link一個 然後就會莫名的只走一個版本的class實作
但為什麼inline跟non-static function會用兩個方式去解釋呢?
2. 我是否能夠把每一個function (看起來可能是可以compile time算出來的function)
無腦加上constexpr (反正若用在需要compile time知道常數值的時候compiler會報錯
再修就好)? 若可以這樣無腦加上去 是不是有可能讓程式變快?
這邊也有個問題是, 網站例子
constexpr int i = gcd(11,121);
是否gcd函數沒加上constepxr的話, compiler就"不允許" 在compile time做計算優化
或是說 int i = gcd(11,121); 兩個都不加上constexpr,
是不是完全都不會再compile time做優化?
如果答案是 都會優化的話 是否代表 constexpr 只是給reader明確讀code的時候
可以清楚知道這件事?
(當然要把這函數用在template那種compile time要知道數值的情況是一定要加的)
3. 既然constexpr有牽扯到compiler optimization, 是否變成就算用A compiler可以
編譯過, 拿到B compiler很可能無法編譯? 造成不可攜
謝謝
作者: firejox (Tangent)   2019-02-06 16:58:00
2. 加constexpr 就只是“希望”能不能在compile time做優化,但compiler 會不會聽到請求則是另一回事但不加compiler 一樣可以幫忙做優化3. 優化是compiler生有效率的machine code的事,跟可攜沒關係
作者: Feis (永遠睡不著 @@)   2019-02-06 18:04:00
我覺得這問題蠻有趣的,不是很容易回答得很清楚。
作者: poyenc (髮箍)   2019-02-06 22:08:00
這個要討論的話也可以跟 consteval 還有 P1045 P0595 等一起比較 :)

Links booklink

Contact Us: admin [ a t ] ucptt.com