【发布时间】:2012-03-15 13:26:46
【问题描述】:
我已将我的代码缩减为以下内容,这在保留我感兴趣的编译器输出的同时尽可能简单。
void foo(const uint64_t used)
{
uint64_t ar[100];
for(int i = 0; i < 100; ++i)
{
ar[i] = some_global_array[i];
}
const uint64_t mask = ar[0];
if((used & mask) != 0)
{
return;
}
bar(ar); // Not inlined
}
将 VC10 与 /O2 和 /Ob1 一起使用,生成的程序集几乎反映了上述 C++ 代码中的指令顺序。由于本地数组 ar 仅在条件失败时传递给 bar(),否则未使用,我希望编译器优化为以下内容。
if((used & some_global_array[0]) != 0)
{
return;
}
// Now do the copying to ar and call bar(ar)...
编译器不这样做是因为它在一般情况下很难识别这种优化吗?或者它是否遵循一些禁止它这样做的严格规则?如果是这样,为什么?有什么方法可以提示它这样做不会改变我的程序的语义?
注意:显然,仅通过重新排列代码来获得优化的输出是微不足道的,但我感兴趣的是为什么编译器在这种情况下不会优化,而不是 如何 在这种(有意简化的)情况下这样做。
【问题讨论】:
标签: c++ visual-c++ optimization compiler-optimization