【问题标题】:Setting all the elements to a same value in C在C中将所有元素设置为相同的值
【发布时间】:2013-10-01 09:27:29
【问题描述】:

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

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

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

【问题讨论】:

标签: c arrays


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    1 虽然memset 采用int,但它会在将其设置到内存区域之前将其转换为unsigned char

    【讨论】:

    • 这里要设置的值是动态获取的,足够大。所以,memset 可以被排除,因为它只能用于将所有元素设置为unsigned char
    【解决方案3】:

    根据其他用户的建议,如果您想使用 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];
    ...
    

    【讨论】:

      【解决方案4】:

      您可以使用 memset() 。它用相同的字节值填充您想要填充的字节数。Here 你可以阅读手册页。

      【讨论】:

        【解决方案5】:

        你可以使用memset()函数

        例子:

        memset(<array-name>,<initialization-value>,<len>);
        

        【讨论】:

          【解决方案6】:

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

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

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

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

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

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

          【讨论】:

            【解决方案7】:

            如果您正在谈论初始化,请参阅this question。如果您想稍后设置这些值,请使用memset

            【讨论】:

              【解决方案8】:

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

              int arr[5]={0};
              

              【讨论】:

                猜你喜欢
                • 2021-11-17
                • 2013-04-23
                • 2015-01-12
                • 1970-01-01
                • 2019-09-29
                • 1970-01-01
                • 2018-01-23
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多