优化期间有符号与无符号整数的别名使用:为何未充分优化?
有符号与无符号引用的编译器行为疑问
首先明确C相关规则:无法用unsigned&初始化signed&(反之亦然),但严格别名规则允许通过unsigned&读写signed对象(反之亦然),详见C20标准[basic.lval]#11.2。从as-if规则的角度,理论上编译器可基于此进行优化。
示例1
按照规则逻辑,函数f完全可以直接跳转调用foo:
void foo(const unsigned& u); void f(const signed& par) { foo(par); }
但实际所有编译器的处理流程都是:先将par加载到寄存器,再把寄存器内容存储到栈上,最后将栈地址传递给foo。
示例2
同理,g1和g2理论上可以指向同一块内存:
const signed& g1 = 1; const unsigned& g2 = g1;
但编译器通常会为它们分配不同的内存地址。
疑问
为什么编译器会做出这样的处理?这是否属于未被利用的优化机会?
内容的提问来源于stack exchange,提问作者Dr. Gut
相关产品推荐
相关产品推荐

