[问题] constexpr 与 static const 的选择

楼主: CarbonK (HTYISABUG)   2019-06-12 02:54:25
开发平台(Platform): (Ex: Win10, Linux, ...)
Linux
编译器(Ex: GCC, clang, VC++...)+目标环境(跟开发平台不同的话需列出)
GCC
问题(Question):
对于 constexpr 跟 static const 的差别不太了解
static const 在编译时期时
常数会直接储存在执行档的 .data 这个 segment 里
这是我的理解
问题是 constexpr 会检查 expression 是否为编译期常数
但检查完后它资料是仍然放在 stack 中
还是也会放在 .data 中
然后我到底该不该用 constexpr 取代 static const ?
还是说其实根本可以 static constexpr ?
麻烦大家拨冗满足我的好奇心,谢谢
作者: sarafciel (Cattuz)   2019-06-12 11:23:00
你如果编译期就保证x=3了 那干嘛还浪费内存去存x直接把程式码里看到的x代换成3就好了
楼主: CarbonK (HTYISABUG)   2019-06-12 11:59:00
我会选择用变量而不是纯数字的原因是为了减少 magic number,增加程式可读性,也是提醒自己数字的用途至于不用 define 的原因是常数我想放在 function 内提醒自己用途以及作用范围而且你没回答到问题欸
作者: sarafciel (Cattuz)   2019-06-12 12:16:00
不 我已经在回答你的问题了constexpr是放.data还是stack?都不是因为真正的常数根本不需要放内存 编在指令里就好了
作者: KaryuuIssen (一闪)   2019-06-12 12:20:00
constexpr要看情况 要保证不产生symbol可用匿名enum
楼主: CarbonK (HTYISABUG)   2019-06-12 14:21:00
你这样讲我就理解你的意思了,看来这部分是由编译器优化掉了这样的话我对 static const 跟 .data 好像有些误解,那么.data 里面存的不是常数的话会是哪些资料呢?@kary(后略) 我的应用场合不太像是要用 enum ,而是定义一些像萤幕长宽、基本速度之类的数值,这些是有可能重复的,所以不能用 enum
作者: oToToT (屁孩)   2019-06-12 14:53:00
匿名enum也可以有scope吧
作者: james732 (好人超)   2019-06-12 15:08:00
.data是用来储存有初始化的全域变量吧?
作者: KaryuuIssen (一闪)   2019-06-12 15:20:00
回原PO 你所指的常数应该是直接嵌在.text中的数字但constexpr并不保证常数不会生成符号(占据.rodata空间) 而匿名enum因为规定是纯右值 所以一定不会有符号 然后我没看懂你说会重复而不能用enum的问题
楼主: CarbonK (HTYISABUG)   2019-06-12 16:19:00
了解,这样我理解两者的差异了,另外那个重复什么的问题说理解错误,谢谢你的解答更正,是我理解错误
作者: firejox (Tangent)   2019-06-13 03:11:00
可以写static constexpr阿
楼主: CarbonK (HTYISABUG)   2019-06-13 13:13:00
原来是可以的吗?谢谢提供答案

Links booklink

Contact Us: admin [ a t ] ucptt.com