C++中对constexpr、const、非const变量使用比较运算符有何差异?
C++不同修饰符变量比较运算差异说明
运行逻辑差异
两段代码的运行逻辑完全一致,最终输出结果没有任何区别:
- 比较运算符的语义不受操作数的
const/constexpr修饰符影响,只要变量实际存储的值相同,判断结果就完全一致 - 修饰符仅作用于编译阶段的规则校验:
const限制变量初始化后不可修改,constexpr要求变量值必须在编译期可确定,这些规则不会改变运行时的取值逻辑
执行性能差异
性能差异仅在特定编译配置下存在:
- 无编译优化(O0级别)时,带修饰符的版本性能略优:
ci、cei的值编译期就已确定且不可变更,编译器会直接将常量2、1代入比较运算,不需要额外从内存读取变量值;无修饰符版本的编译器会保守认为ci、cei可能被修改,每次比较都需要从栈内存读取值,多了访存开销 - 开启O2及以上级别编译优化时,两段代码性能完全一致:编译器会通过常量传播、逃逸分析判断出无修饰符版本的
ci、cei在比较前没有被修改,同样会将其优化为常量参与运算,最终生成的汇编指令和带修饰符的版本没有任何区别
补充说明
如果是自定义类型的变量参与比较,constexpr修饰的变量还可以将比较运算提前到编译期完成,完全消除运行时的运算开销,但当前示例中的基础int类型场景下,开启优化后两类实现的差异会被完全抹平。
内容的提问来源于stack exchange,提问作者DeEterna
相关产品推荐
相关产品推荐

