2

这是我遇到问题的 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
}

我的问题如下:

  1. 如果我评论第 1 行和第 2 行,则代码大约运行。109 毫秒;
  2. 如果我只评论 LINE2 代码运行大约。在 115 毫秒内;
  3. 如果我评论 LINE 1 并且 bit_count=0 代码运行大约 130 毫秒;
  4. 如果两行(第 1 行和第 2 行)均未注释,则代码大约运行。350 毫秒。

为什么我使用 LINE1 和 LINE2 时代码很慢?我找不到任何可以接受的解释。

请注意,我也尝试了 vec.push_back(bit_count),它也很慢。我也尝试了不同的演员操作,但没有成功。

4

1 回答 1

2

在情况 2 中,编译器可能不会完全计算 bit_count,因为它从未使用过(例如,它可能会进行 XOR 但不会进行计数)

在案例 3 中,您只有分配

只有在第 4 种情况下,才需要执行 bit_count(相当昂贵)。

(编辑澄清:如果你从不使用vec,它可能仍然会丢弃整个循环。但它不必这样做)


附加信息:

要求编译器只保留可观察的行为,定义为

  • 访问易失性对象
  • 输入和输出(包括文件)
  • 调用“未知”代码(例如外部库)

标准的措辞当然更复杂,这个问题有一些额外的讨论。

我一直觉得观察你的编译器是一个有趣的练习。大多数允许启用反汇编输出,带着探究的头脑和一个小时的“介绍我的处理器的组装”,这样的小练习可以非常有见地

于 2011-11-23T19:38:02.570 回答