以下是我遇到问题的C ++代码的一部分:
std::bitset<64>a;
std::bitset<64>b;
std::bitset<64>c;
int bit_count=0;
std::vector<int> vec(SIZE,0);
for (i=1;i<NUM;i++)
{
// I do here some operations on a and b (a and b will have bits that are set)
c=a^b;
bit_count=(int) c.count(); // LINE 1
vec[i]=bit_count; // LINE2 2
}
我的问题如下:
为什么使用LINE1和LINE2时代码会变慢?我找不到任何可接受的解释。
请注意,我也尝试了vec.push_back(bit_count),它也很慢。我也尝试了不同的演员表演。
答案 0 :(得分:2)
在情况2中,编译器可能无法完全计算bit_count,因为它从未使用过(例如它可能执行XOR而不是计数)
在案例3中,您只有作业
仅在情况4中,需要执行bit_count(whcih相当昂贵)。
(编辑澄清:如果你从不使用vec
,它可能仍然会抛弃整个循环。但它不必,但是)
其他信息:
要求编译器仅保留可观察行为,定义为
标准措辞当然更复杂,this question还有一些额外的讨论。
我总是觉得观察编译器是一项有趣的练习。大多数允许启用反汇编输出,具有一定的思想和一小时的“介绍我的处理器的程序集”不足之处,像这样的小练习可以非常有见地