作者lovejomi (JOMI)
看板C_and_CPP
标题[问题] constexpr观念厘清
时间Wed Feb 6 11:14:02 2019
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://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1549422850.A.2CA.html
1F:推 firejox: 2. 加constexpr 就只是“希望”能不能在compile time做 02/06 16:58
2F:→ firejox: 优化,但compiler 会不会听到请求则是另一回事 02/06 16:58
3F:→ firejox: 但不加compiler 一样可以帮忙做优化 02/06 17:00
4F:推 firejox: 3. 优化是compiler生有效率的machine code的事,跟可携 02/06 17:05
5F:→ firejox: 没关系 02/06 17:05
6F:推 Feis: 我觉得这问题蛮有趣的,不是很容易回答得很清楚。 02/06 18:04
7F:推 poyenc: 这个要讨论的话也可以跟 consteval 还有 P1045 P0595 等一 02/06 22:08
8F:→ poyenc: 起比较 :) 02/06 22:08