【发布时间】:2013-10-01 09:27:29
【问题描述】:
注意:有类似的帖子只针对 C++,我没有找到任何关于 C 的有用帖子。
我想设置具有相同值的元素数组。当然,这可以简单地使用 for 循环来实现。
但是,这会耗费大量时间。因为,在我的算法中,这个具有相同值的设置数组发生了很多次。有什么简单的方法可以在 C 中实现这一点。
【问题讨论】:
-
数组类型是什么,值是什么?
注意:有类似的帖子只针对 C++,我没有找到任何关于 C 的有用帖子。
我想设置具有相同值的元素数组。当然,这可以简单地使用 for 循环来实现。
但是,这会耗费大量时间。因为,在我的算法中,这个具有相同值的设置数组发生了很多次。有什么简单的方法可以在 C 中实现这一点。
【问题讨论】:
使用 for 循环。任何体面的编译器都会尽可能地对此进行优化。
【讨论】:
几乎可以肯定,您无法大幅提高for 循环的速度。没有什么神奇的方法可以比将值存储到多个内存位置更快地设置一个值到多个内存位置。无论您是否使用for 循环,所有位置都必须写入,这需要大部分时间。
当然有void * memset ( void * ptr, int value, size_t num ); 用于由相同字节组成的值1,但在引擎盖下它有一个循环。也许实现可以非常聪明地使用该循环,但优化编译器也可以。
1 虽然memset 采用int,但它会在将其设置到内存区域之前将其转换为unsigned char。
【讨论】:
memset 可以被排除,因为它只能用于将所有元素设置为unsigned char。
根据其他用户的建议,如果您想使用 0 值初始化数组,请使用 memset,但如果值不是那么简单,请不要这样做。
对于更复杂的值,您可以拥有初始值的常量副本,稍后使用memcpy 复制它们:
float original_values[100]; // don't modify these values
original_values[0] = 1.2f;
original_values[1] = 10.9f;
...
float working_values[100]; // work with these values
memcpy(working_values, original_values, 100 * sizeof(float));
// do your task
working_values[0] *= working_values[1];
...
【讨论】:
您可以使用 memset() 。它用相同的字节值填充您想要填充的字节数。Here
你可以阅读手册页。
【讨论】:
你可以使用memset()函数
例子:
memset(<array-name>,<initialization-value>,<len>);
【讨论】:
您可以轻松地将memset 一个数组设为0。
如果你想要不同的值,这完全取决于使用的类型。
对于 char* 数组,您可以将它们memset 设置为任何值,因为 char 几乎总是一个字节长。
对于结构数组,如果结构的所有字段都需要初始化为0或NULL,可以memset它为0。
您不能将数组或结构数组 memset 设置为 0 以外的任何值,因为 memset 对单个字节进行操作。因此,如果您将 int[] 设置为 1,则不会有一个 1 的数组。
要使用自定义值初始化结构数组,只需用所需数据填充一个结构并在for 中对其进行赋值。编译器应该会相对高效地为您完成。
【讨论】:
如果您正在谈论初始化,请参阅this question。如果您想稍后设置这些值,请使用memset
【讨论】:
您只能将特定数组的值设置为零。这是一个例子
int arr[5]={0};
【讨论】: