我有一个 int 数组,我必须用值 -1 初始化这个数组。现在我使用这个循环:
int i;
int myArray[10];
for(i = 0; i < 10; i++)
myArray[i] = -1;
有更快的方法吗?
我有一个 int 数组,我必须用值 -1 初始化这个数组。现在我使用这个循环:
int i;
int myArray[10];
for(i = 0; i < 10; i++)
myArray[i] = -1;
有更快的方法吗?
我知道值-1
(或0
)的最快方法是memset:
int v[10];
memset(v, -1, 10 * sizeof(int));
无论如何,您可以通过这种方式优化循环:
int i;
for(i = 10; i--;)
v[i] = -1;
如果你想在声明的时候用 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;
}
memset
非常快。
int arr[10];
memset(arr, -1, sizeof(arr));
但是,无论如何,您所拥有的可能会被优化编译器转换为对 memset 的调用。查看您的程序集输出以确保,但循环在编译时保持循环的可能性很小。
在 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};