我有一个int数组,我必须使用值-1初始化此数组。现在我使用这个循环:
int i;
int myArray[10];
for(i = 0; i < 10; i++)
myArray[i] = -1;
有更快的方法吗?
答案 0 :(得分:7)
我知道价值-1
(或0
)的最快方式是memset:
int v[10];
memset(v, -1, 10 * sizeof(int));
无论如何,你可以用这种方式优化循环:
int i;
for(i = 10; i--;)
v[i] = -1;
答案 1 :(得分:6)
如果要在声明时使用0初始化数组,可以使用:
int a[10] = {0};
非常快。但是,如果您想要使用其他值初始化或者想在稍后的代码中使用0重新初始化数组,请使用:
memset(a, -1, size_a);
(或分别为memset(a, 0, size_a);
)或循环。在我看来,总是更喜欢memset()
循环,因为memset()
经常被优化以将内存中的整个单词设置为作为其参数给出的初始化值,而不是设置单个字节。
对于统计数据,在我的32位Linux安装中使用4GB内存和2.2GHz * 2处理器时,下面给出了四种类型的阵列初始化代码的运行时间:
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;
}
答案 2 :(得分: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};
答案 3 :(得分:1)
memset
非常快。
int arr[10];
memset(arr, -1, sizeof(arr));
但是,你所拥有的东西很可能会被优化编译器调用到memset。查看汇编输出以确保,但在编译时循环不太可能保持循环。