看板 C_and_CPP 關於我們 聯絡資訊
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很可能無法編譯? 造成不可攜 謝謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 110.28.160.102 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1549422850.A.2CA.html
firejox: 2. 加constexpr 就只是“希望”能不能在compile time做 02/06 16:58
firejox: 優化,但compiler 會不會聽到請求則是另一回事 02/06 16:58
firejox: 但不加compiler 一樣可以幫忙做優化 02/06 17:00
firejox: 3. 優化是compiler生有效率的machine code的事,跟可攜 02/06 17:05
firejox: 沒關係 02/06 17:05
Feis: 我覺得這問題蠻有趣的,不是很容易回答得很清楚。 02/06 18:04
poyenc: 這個要討論的話也可以跟 consteval 還有 P1045 P0595 等一 02/06 22:08
poyenc: 起比較 :) 02/06 22:08