在我正在处理的程序中,这个特定的操作肯定不会成为瓶颈,但它确实让我开始思考。来自诸如this one等问题的回答和 this one我学会了两种在 C 语言中轻松(高效)将数组的所有元素设置为零的方法:
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
声明为 的数组,是否需要隐式转换code>double
的?
无论如何,我真正的问题是:如果数组根本不是很大(就像我在上面声明的 myArray
一样),这些方法中的任何一个仍然比一个小循环更受欢迎吗?如果你有几个同样小的数组都需要赋零怎么办?如果评论得当,您是否认为可读性是决定的一个因素并支持特定的解决方案?
完全清楚:我不希望将数组初始化为零。
最佳答案
如果它只是一个小数组(比如三个元素),使用mem*
函数、循环或三个可能不会有太大区别不同的任务。事实上,后一种情况甚至可能更快,因为您不会承受函数调用的成本:
myArry[0] = myArray[1] = myArray[2] = 0;
但是,即使一个更快,这种差异可能也不值得担心。我倾向于先针对可读性进行优化,然后在需要时针对空间/存储进行优化。
如果要在 memcpy
和 memset
之间做出选择,我会选择后者(假设,似乎是这样,全零位模式实际上在你的实现中表示 0.0
)有两个原因:
- 它不需要存储归零数组;和
- 如果您更改一个数组的大小而忘记另一个数组的大小,前者会给您带来麻烦。
而且,就其值(value)而言,您的memset
解决方案并不需要进行乘法运算。由于您可以获得整个数组的大小,因此您可以这样做:
memset (myArray, 0, sizeof (myArray));
关于c - 为C中的所有数组元素分配一个零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24130973/