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

Ore*_*ren 0 c memset

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

1)

int i;
for(i=0;i<ARRAYSLENGTH;i++){
    arr1[i]=0;
    arr2[i]=0;
    arr3[i]=0;
    ...
}
Run Code Online (Sandbox Code Playgroud)

2)将memset所有数组归零.

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

2被认为比1更可读吗?

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

abe*_*nky 6

你的方法1(for循环)对缓存不好.

由于arr1,arr2,arr3可能不是在任何地方接近彼此在内存中,并且很可能不会在缓存在一起,你可以有频繁的缓存缺失,CPU将必须不断地从内存中取新的作品,只是将它们设置为零.

通过这样做一组memset动作,你打所有arr1完全从缓存,一次,几乎可以肯定.然后你将快速缓存和设置所有arr2,等等.

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