我有多个相同长度的数组,我希望用零填充。让我们看看两种方法:
int i;
for(i=0;i<ARRAYSLENGTH;i++){
arr1[i]=0;
arr2[i]=0;
arr3[i]=0;
...
}
memset
将所有数组归零。在最近的一次代码审查中,我被要求将选项1更改为选项2.这让我想知道,哪种方法更好?主要是:
2被认为比1更可读吗?
这两种方法在效率方面有何比较? (考虑memset
通常在汇编中实现,但方法1仅为多个数组递增计数器一次。)
答案 0 :(得分:6)
您的方法1(for
循环)对缓存不利。
作为arr1
,arr2
,arr3
在内存中可能不会彼此靠近,并且很可能不会一起在缓存中,您可能会频繁出现缓存未命中,并且CPU必须不断地从内存中获取新的部分,只是将它们设置为零。
通过执行一组memset
次操作,您可以立即点击arr1
的 ALL ,几乎可以肯定地完全来自缓存。然后,您将非常快速地缓存和设置所有arr2
等等。
那,并且因为memset
可能有装配技巧和优化以使其更快,我肯定更喜欢选项2而不是选项1。
答案 1 :(得分:0)
我认为大多数程序员应该能够阅读memset并知道它在做什么,因此可读性不应成为问题。 对于大多数现代编译器,你可能不会看到很多性能差异,但我会使用memset,因为它就是它的用途。
答案 2 :(得分:0)
您甚至可以使用bzero而不是更具体的memset