关于程序优化的问题,c/c++赋值数组快慢问题?

新手上路,请多包涵

有个面试题:
步长为1给数组赋值和步长为4给数组赋值的操作。
前者耗时是不是后者的4倍。

for (int i = 0; i < n; i += 1) {

a[i] = 1;

}
for (int i = 0; i < n; i += 4) {

a[i] = 1;

}

应该从内存局部性和缺页命中这方面考虑吧。
我觉得这两种不同的赋值,都直接从内存去取数组,一般数组不大,一次就全部取来了,所以这两种操作的时间差距不应该有4倍那么大。
而具体赋值耗时之类的,我就有点疑惑了。
有没有大佬能说说。

阅读 4.5k
1 个回答

你自己测试一下就知道了。这种问题有很多人问过、研究过的,StackOverflow 上应该有不少。

CPU 并不直接从内存取数据,它有缓存,而且是好几级。情况很复杂,比如还有指令和数据分开缓存的系统架构,还有多 CPU 的 NUMA 机器。CPU 的字长当然是会有影响的。

另一方面,编译器优化也会有影响。

还有个问题,你这里没有给出 a 的类型,而打上了 C++ 的标签。在 C++ 里,赋值操作可以是很复杂的。当然取下标操作也可以很复杂。

「一般数组不大」这个结论你是哪里来的……在现代PC上,我猜这两个代码的效率应该是差不多的。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题