【发布时间】:2018-02-06 06:55:51
【问题描述】:
在函数'doSomething'中,'number'每次递增都会被带入缓存吗?
编辑: 我问是因为我遇到了 Mike Acton 的一些 cmets。他发表了this 评论,然后建议使用本地寄存器。 Here 是 cmets 的全部集合。
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;
}
【问题讨论】:
-
我会说它会留在缓存中...这就是缓存的作用:将不断被访问的数据保存在处理器附近的快速内存中。跨度>
-
就您而言,它已经在内存中。 操作系统 将根据使用情况对其进行分页和分页。它与编译器或语言没有任何关系。
-
而且我当然不建议获取并浏览 57 页具有这样标题的文件,但迈克·阿克顿,不管他是谁,只是问了一个愚蠢的问题。在内部循环中写入类成员没有任何问题。 当且仅当确定这是一个性能瓶颈,您可能会考虑使用寄存器,但如果涉及其他线程,您将不得不担心语义正确性。一般原则是编写简单的代码,让编译器担心性能,除非另有说明。
-
@EJP - 是的,而且......我读了大约一半的内容并确定 Mike Acton,无论他是谁,都不是他认为的代码审查之神。有些建议很好(虽然很明显)......其他的不那么热门。 OP 应该深思熟虑,运行微实验并查看生成的代码(如有必要)