c - 为C中的所有数组元素分配一个零

标签 c arrays performance readability

在我正在处理的程序中,这个特定的操作肯定不会成为瓶颈,但它确实让我开始思考。来自诸如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;

但是,即使一个更快,这种差异可能也不值得担心。我倾向于先针对可读性进行优化,然后在需要时针对空间/存储进行优化。

如果要在 memcpymemset 之间做出选择,我会选择后者(假设,似乎是这样,全零位模式实际上在你的实现中表示 0.0)有两个原因:

  • 它不需要存储归零数组;和
  • 如果您更改一个数组的大小而忘记另一个数组的大小,前者会给您带来麻烦。

而且,就其值(value)而言,您的memset 解决方案并不需要进行乘法运算。由于您可以获得整个数组的大小,因此您可以这样做:

memset (myArray, 0, sizeof (myArray));

关于c - 为C中的所有数组元素分配一个零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24130973/

相关文章:

python - pcolorfast 上的 matplotlib MemoryError

c - if(varName) 和 if(varName!=NULL) 有什么区别?

C 根据带指针的字符串输入打印特定字符

c - 动态内存分配麻烦

javascript - 将构造函数传递给 Array.map?

php - laravel是否有可能达到1000 TPS?

java - getter 和 setter 被编译器内联的概率

c - 为什么这些构造使用前后递增的未定义行为?

c - 如何取消分支预测?

javascript - 根据属性出现将数组拆分为新数组