消息关闭
    暂无新消息!

有个面试题:
步长为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倍那么大。
而具体赋值耗时之类的,我就有点疑惑了。
有没有大佬能说说。


1个回答

︿ 1

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

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

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

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

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