【问题标题】:Assigning a zero to all array elements in C将零分配给C中的所有数组元素
【发布时间】:2014-06-10 00:13:28
【问题描述】:

在我正在处理的程序中,这个特定的操作绝对不会成为瓶颈,但它确实让我思考。从this onethis 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 声明为 double 的数组,是否隐式转换?

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

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

【问题讨论】:

  • 如果你关心可读性,memset 是代码的方式。或者,如果您在 Windows 平台上使用原生 API,则使用 ZeroMemory 函数

标签: c arrays performance readability


【解决方案1】:

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

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

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

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

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

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

【讨论】:

  • 当然,假设特定硬件上的浮点格式是这样的,所有零字节实际上都会导致值 0.0。
  • @Rudy,是的。但是对于 OP,就是,因为他们提到了 memset 的使用。现在你很难找到一个不使用 IEEE754 浮点的 C 实现:-) 但我会更新完整性,谢谢。
  • 谢谢,我真的不知道你可以像在 C 中那样在一行上做三重赋值!
  • Wouter,请记住,它可能并不比三个赋值语句更有效,它更像是语法糖。好吧,如果您要减少的是源代码占用的空间而不是运行时间,它会更有效 :-)
  • 如果myArray[3]的范围是双倍的;在文件中。我将使用静态。静态将负责将其分配为零。默认情况下,所有静态变量都分配为零。还记得吗?
【解决方案2】:

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

发生的情况是数组的 merroy 按位按 0 (& 0),因此它比对数组中的每个元素使用循环更快。

【讨论】:

  • 它不是bitwise and-ed,它只是用全零覆盖,无论现有内容是什么。
猜你喜欢
  • 1970-01-01
  • 2012-02-27
  • 1970-01-01
  • 1970-01-01
  • 2017-01-02
  • 1970-01-01
  • 1970-01-01
  • 2013-05-28
  • 1970-01-01
相关资源
最近更新 更多