[问题] constexpr 的实作

楼主: wtchen (没有存在感的人)   2016-11-21 21:04:24
问题(Question):
这边不是问怎么用constexpr,而是问怎么编译去实现constexpr这个功能。
假设我某个code是这样:
int main() {
(...)
const double a = 0.5;
constexpr double A = asin(a);
(...)
}
asin是在math.h里的函式,要在link的时候才能知道asin的函数长怎样。
那A是怎么转成常数的?
我能想到的是把有constexpr的档案都先抓出来,
link后找到对应函式的指标后,把constexpr等字样根据函式转换成const,
然后重新编译+link。
只是不知道实际做起来是怎样,有人可以详述吗?感谢?
作者: LPH66 (-6.2598534e+18f)   2016-11-22 00:24:00
constexpr 仅限呼叫有宣告为 constexpr 的函式这些函式其函数内容当给定常数参数时可以静态分析其值而 constexpr 的规定有说这函数要编译期可见
作者: CoNsTaR ((const *))   2016-11-22 00:26:00
asin 回传的 value 必须属于 (constexpr a) A 才接得住
作者: LPH66 (-6.2598534e+18f)   2016-11-22 00:26:00
像 asin 这种连结期才知道的东西不能也不会宣告 constexpr
作者: CoNsTaR ((const *))   2016-11-22 00:27:00
asin 应该不是,而且刚刚查了一下 gcc 有把它当 builtin所以这样猜
作者: LPH66 (-6.2598534e+18f)   2016-11-22 00:28:00
有个可能的实作法是这函数是模版, 这样它编译期一定可见例如 std::numeric_limits<int>::max 就是这样的例子啊, 不用到那个, std::max 就是一个例子了顺带一提, 标准规定的函式实作不能任意增减 constexpr 性所以不会发生你家的 max 有但我家的 max 没有结果爆炸
作者: Caesar08 (Caesar)   2016-11-22 01:23:00
为什么标准的function不能增加constexpr?不能减少是因为这样不符合标准但增加constexpr可以增强library的效能,应该会想做才对
作者: LPH66 (-6.2598534e+18f)   2016-11-22 05:40:00
应该说标准规定有的就要有, 规定没有的就要没有像我上面提的 max 标准都有 constexpr 所以实作也必须有我猜原因可能还是一致性, 不会因为某个函数在某个实作上有 constexpr 造成在其他编译器上编不过en.cppreference.com/w/cpp/language/constant_expression最下面 Notes 的那一段
作者: CoNsTaR ((const *))   2016-11-22 18:19:00
两个不同的 type 没办法这样做(a 有 constexpr, func 没有)试想要是 func 里面有 IO 的话该怎么办?在 pure functional language 里可以做到你想的,例如 Idris 的 Refl因为所有有 side effect 的 function 的回传值都会是 ∀a.(IO a),而且不允许 undefined (例如无穷循环) 所以可以粗略的区分哪些值可以在编译时期求得哪些不行听起来是可行 只是如果真要这么麻烦我宁可换个语言 XDD
楼主: wtchen (没有存在感的人)   2016-11-22 22:03:00
也是 XD

Links booklink

Contact Us: admin [ a t ] ucptt.com