[问题] 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