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

发布于 2022-09-05 08:45:55 字数 366 浏览 25 评论 0

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

征﹌骨岁月お 2022-09-12 08:45:55

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

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

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

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

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文