1

注意:只有 C++ 有类似的帖子,我没有找到任何关于 C 的有用帖子。

我想设置具有相同值的元素数组。当然,这可以简单地使用 for 循环来实现。

但是,这会耗费大量时间。因为,在我的算法中,这个具有相同值的设置数组发生了很多次。有什么简单的方法可以在 C 中实现这一点。

4

8 回答 8

5

使用 for 循环。任何体面的编译器都会尽可能地对此进行优化。

于 2013-10-01T09:36:51.620 回答
4

几乎可以肯定的是,您将无法大幅提高for循环速度。没有什么神奇的方法可以比将值存储到多个内存位置更快地设置一个值到多个内存位置。无论您是否使用for循环,都必须写入所有位置,这需要大部分时间。

当然有void * memset ( void * ptr, int value, size_t num );由相同字节组成的 for 值1,但在引擎盖下它有一个循环。也许实现可以非常聪明地使用该循环,但优化编译器也可以。

1虽然memset需要一个int,但它会在将其unsigned char设置到内存区域之前将其转换为。

于 2013-10-01T09:36:52.937 回答
3

正如其他用户所建议的那样,memset如果要使用 0 值启动数组,请使用,但如果值不是那么简单,请不要这样做。

对于更复杂的值,您可以拥有初始值的恒定副本,并在以后使用以下命令复制它们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];
...
于 2013-10-01T09:52:33.017 回答
1

您可以使用memset(). 它不填充您要填充相同字节值的字节。在这里 您可以阅读手册页。

于 2013-10-01T09:31:27.130 回答
1

你可以使用memset()函数

例子:

memset(<array-name>,<initialization-value>,<len>);
于 2013-10-01T09:39:23.580 回答
0

您可以轻松地memset将数组设置为 0。

如果您想要不同的值,这完全取决于使用的类型。

对于char*数组,您可以memset将它们设置为任何值,因为 char几乎总是一个字节长。

对于结构数组,如果结构的所有字段都用0或NULL初始化,可以用0初始化memset

您不能将数组或结构数组 memset 设置为 0 以外的任何值,因为 memset 对单个字节进行操作。因此,如果您int[]使用 1 进行 memset ,您将不会有一个 1 的数组。

要使用自定义值初始化结构数组,只需用所需数据填充一个结构并在for. 编译器应该为您相对有效地完成它。

于 2013-10-01T09:33:59.153 回答
0

如果您正在谈论初始化,请参阅此问题。如果您想稍后设置值,请使用memset

于 2013-10-01T09:35:30.973 回答
0

好吧,您只能将特定数组的值设置为零。这是一个例子

int arr[5]={0};
于 2013-10-01T09:35:35.160 回答