在'doSomething'函数中,每次递增时都会将'number'带入缓存中吗?
编辑: 我问,因为我遇到了Mike Acton的一些评论。他发表了this评论,然后建议使用本地注册。 Here是整个评论集。
class a
{
public:
int number;
void doSomething();
}
void a::doSomething()
{
for (int i = 0; i < 50; ++i)
{
number += i;
}
}
int main()
{
a;
a.doSomething();
return 0;
}
答案 0 :(得分:0)
最有可能的是,如果实际发出了循环,它将在第一次访问时被带入高速缓存,并保持在那里直到循环结束(再次,可能;它不像编译器对此具有特定的控制权,通常在普通存储器访问中透明地引入高速缓存。
请注意,此处的编译器也允许将代码转换为:
int n = number;
for (int i = 0; i < 50; ++i)
{
n += i;
}
number = n;
因为循环中没有函数调用可能会看到number
的中间状态(也没有强制中间状态对其他线程可见的内存屏障)。 n
这里可能是一个寄存器,因此缓存不相关。
最后,几个现代编译器实际上将其优化为:
number += 1225;
所以没有那么多的缓存访问让人担心。
答案 1 :(得分:0)
您在询问幻灯片45,但我会评论所有这些幻灯片。
else
,但是没有像样的编译器会为它们生成分支。即使它确实如此,它们也永远不会被占用,所以它们只需要花费空间,而不是时间。virtual
很难得到&#39;。m
是一个归纳变量,因此很有可能它已被编译器优化掉了。register
声明。鉴于有关语义约束的足够信息,编译器完全能够为自己进行优化。enum
值本身并不是[e]不需要的分支&#39;。需要进行适当的解释而不提供。我不认为我已经阅读过20多年的垃圾了。我必须严肃质疑每个问题使用四个和五个便利贴的人的心态。而且他很少提供实际的解决方案。