我们最近在大学里参加了一场关于几种语言中编程特性的讲座。
演讲者写下了以下函数:
inline u64 Swap_64(u64 x)
{
u64 tmp;
(*(u32*)&tmp) = Swap_32(*(((u32*)&x)+1));
(*(((u32*)&tmp)+1)) = Swap_32(*(u32*) &x);
return tmp;
}
我完全理解这也会影响代码的可读性,但他的主要观点是,该代码部分在生产代码中运行得很好,直到他们启用了高优化级别。然后,代码就什么都不做了。
他说,变量tmp
的所有赋值都将被编译器优化掉。但为什么会发生这种情况呢?
我知道有时需要声明变量为volatile,以便编译器即使认为它们永远不会被读或写,也不会触及它们,但我不知道为什么这里会出现这种情况。
gcc (Ubuntu/Linaro 4.7.2-5ubuntu1) 4.7.2
,并且在所有优化级别下都得到了预期的结果。(当然这并不能证明什么,但我试图找到一个它会失败的优化级别) - leemes