strict alias规则约束可能带来的问题
1、现象:在Linux下的c开发过程中,发现有的模块、函数在编译时加上-O2编译参数时,运行的结果就不对了
2、原因:是-O2 默认开启了strict alias选项,我们程序编写的方式不符合strict alias规范,导致编译器优化的程序和实际行为不一致。
3、解决:1)修改程序使其符合strict alias规范
2)关闭strict alias选项
补充:
strict alias规则约束下,编译器可以更好的优化代码,否则编译器有可能会生成臃肿的代码 比如:
void fool(int *x, int *y, int *z)
{
*x += *z;
*y += *z;
}
编译后的代码可能如下
movl (%rdx), %eax
addl %eax, (%rdi)
movl (%rdx), %eax
addl %eax, %(rsi)
在非strict alias规范下, x,y,z 可能指向同一个地址,为了保证程序的逻辑正确,编译器需要加载两次z
而在strict alias规范下,编译器只需要加载一次z
最后再贴上strict aliasing的规则说明,下面这篇文章给出了较好的中文翻译,而且作者显然比我研究的更深入,我就直接抄过来了: