7

我有一个 int 数组,我必须用值 -1 初始化这个数组。现在我使用这个循环:

int i;
int myArray[10];

for(i = 0; i < 10; i++)
    myArray[i] = -1;

有更快的方法吗?

4

4 回答 4

9

我知道值-1(或0)的最快方法是memset

int v[10];
memset(v, -1, 10 * sizeof(int));

无论如何,您可以通过这种方式优化循环:

int i;
for(i = 10; i--;)
    v[i] = -1;
于 2012-06-04T17:48:52.163 回答
6

如果你想在声明的时候用 0 初始化数组,你可以使用: int a[10] = {0};,速度非常快。但是,如果您想使用其他值进行初始化,或者想在代码稍后的某个时间点使用 0 重新初始化您的数组,请使用:( memset(a, -1, size_a);memset(a, 0, size_a);分别)或循环。在我看来,总是更喜欢memset()循环,因为memset()通常优化为将内存中的整个单词设置为其参数给出的初始化值,而不是设置单个字节。

统计一下,在我安装的 32 位 4GB 内存和 2.2GHz*2 处理器的 Linux 上,四种数组初始化代码的运行时间如下:

1)。0.002s

#include <string.h>

#define SIZE 1000000

int a[SIZE];

int main(void)
{
    return 0;
}

2)。0.008s

#include <string.h>

#define SIZE 1000000

int main(void)
{
    int a[SIZE] = {0};
    return 0;
}

3)。0.003s

#include <string.h>

#define SIZE 1000000

int main(void)
{
    int a[SIZE];
    memset(a, -1, SIZE);
    return 0;
}

4)。0.011s

#include <string.h>

#define SIZE 1000000

int main(void)
{
    int a[SIZE];
    int i;
    for(i = 0; i < SIZE; i++)
        a[i] = -1;
    return 0;
}
于 2012-06-04T19:40:50.137 回答
2

memset非常快。

int arr[10];
memset(arr, -1, sizeof(arr));

但是,无论如何,您所拥有的可能会被优化编译器转换为对 memset 的调用。查看您的程序集输出以确保,但循环在编译时保持循环的可能性很小。

于 2012-06-04T17:52:27.390 回答
2

在 GNU C 中,您可以做的是:

int myArray[10] = {[0 ... 9] = -1};

初始化一系列元素: http: //gcc.gnu.org/onlinedocs/gcc/Designated-Inits.html

正如没有人提到的那样,在便携式 C 中:

int myArray[10] = {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1};
于 2012-06-04T17:55:28.607 回答