Memset或for循环将多个相同长度的数组归零

时间:2012-12-28 14:39:07

标签: c memset

我有多个相同长度的数组,我希望用零填充。让我们看看两种方法:

1)

int i;
for(i=0;i<ARRAYSLENGTH;i++){
    arr1[i]=0;
    arr2[i]=0;
    arr3[i]=0;
    ...
}

2)memset将所有数组归零。

在最近的一次代码审查中,我被要求将选项1更改为选项2.这让我想知道,哪种方法更好?主要是:

2被认为比1更可读吗?

这两种方法在效率方面有何比较? (考虑memset通常在汇编中实现,但方法1仅为多个数组递增计数器一次。)

3 个答案:

答案 0 :(得分:6)

您的方法1(for循环)对缓存不利。

作为arr1arr2arr3在内存中可能不会彼此靠近,并且很可能不会一起在缓存中,您可能会频繁出现缓存未命中,并且CPU必须不断地从内存中获取新的部分,只是将它们设置为零。

通过执行一组memset次操作,您可以立即点击arr1 ALL ,几乎可以肯定地完全来自缓存。然后,您将非常快速地缓存和设置所有arr2等等。

那,并且因为memset可能有装配技巧和优化以使其更快,我肯定更喜欢选项2而不是选项1。

答案 1 :(得分:0)

我认为大多数程序员应该能够阅读memset并知道它在做什么,因此可读性不应成为问题。 对于大多数现代编译器,你可能不会看到很多性能差异,但我会使用memset,因为它就是它的用途。

答案 2 :(得分:0)

您甚至可以使用bzero而不是更具体的memset