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很可能無法編譯? 造成不可攜
謝謝