为C中的所有数组元素分配零

时间:2014-06-10 00:13:29

标签: c arrays performance readability

在我正在开发的程序中,这个特定的操作肯定不会成为瓶颈,但它确实让我思考。从this onethis one等问题的答案中,我学会了两种方法可以轻松(有效地)将数组中的所有元素设置为零:

double myArray[3];
static const double zeroes[3] = {0};
memcpy(myArray, zeroes, sizeof(zeroes));

double myArray[3];
memset(myArray, 0, numberOfElementsInMyArray * sizeof(myArray[0]));

在我提出真正的问题之前:我不完全确定,但基于the information我读过,我认为这种方法至少在原则上会用int填充数组零(嗯,unsigned char,但these seem to be fairly equivalent)。那是对的吗?如果是,那么将int零显式转换为必需的double个零,或者如果myArray被声明为double的数组,它是否隐式完成?

无论如何,我真正的问题是:如果数组不是很大(就像我上面声明的myArray那样),这些方法中的任何一个仍然比一个小循环更受欢迎吗?如果你有一些相同的小尺寸的数组,所有需要分配的零怎么办?如果评论正确,您是否认为可读性是决策中的一个因素并且有利于特定的解决方案?

完全清楚:我希望将数组初始化为零。

2 个答案:

答案 0 :(得分:2)

如果它只是一个数组(比如三个元素),那么无论使用mem*函数还是循环,它都可能不会有太大的区别,或三个不同的任务。事实上,后一种情况甚至可能更快,因为您没有承受函数调用的成本:

myArry[0] = myArray[1] = myArray[2] = 0;

但是,即使一个 更快,差异可能也不值得担心。我倾向于优化可读性然后,如果需要,稍后优化空间/存储。

如果是memcpymemset之间的选择,我选择后者(假设,似乎是这种情况,实际上表示的是全零位模式{{ 1}}在您的实现中)有两个原因:

  • 它不需要存储归零阵列;和
  • 如果改变一个阵列的大小而忘记另一个阵列,前者会让你遇到麻烦。

而且,对于它的价值,您的0.0解决方案并不需要进行乘法运算。由于您可以获得整个数组的大小,您可以这样做:

memset

答案 1 :(得分:0)

我认为第一种不使用循环设置的方法对性能更好

发生的事情是数组的merroy被0(& 0)bitwised所以它比为数组中的每个元素使用一个循环更快。