在C中初始化数组 - 执行时间

时间:2014-05-01 17:18:28

标签: c arrays performance

int a[5] = {0}; 

VS

typedef struct 
{ 
 int a[5]; 
} ArrStruct; 
ArrStruct arrStruct; 
sizeA = sizeof(arrStruct.a)/sizeof(int);
for (it = 0 ; it < sizeA ; ++it) 
    arrStruct.a[it] = 0; 

用for循环初始化需要更多的执行时间吗?如果是这样,为什么?

2 个答案:

答案 0 :(得分:2)

这取决于编译器和优化标志。

在最近的GCC(例如4.8或4.9)上gcc -O3(或者甚至可能是-O1-O2)它应该没关系,因为会发出相同的代码(GCC甚至优化将您的循环转换为builtin_memset,这将进一步优化。

在某些编译器上,可能会发生int a[5] = {0};可能更快,因为编译器可能会发出例如向量指令(或在x86上rep stosw)清除数组。

最好的方法是检查生成的(gimple表示和)汇编程序代码(例如使用gcc -fdump-tree-gimple -O3 -fverbose-asm -mtune=native -S)并进行基准测试。大多数情况并不重要。确保在编译时启用优化。

一般来说,不要关心这种微观优化;一个好的优化编译器比你有时间编码要好。

答案 1 :(得分:1)

这取决于变量的范围。对于静态或全局变量,第一次初始化

int a[5]={0};

可以在编译时完成,而循环在运行时运行。因此,没有&#34;执行&#34;与前者有关。

您可能会发现this question(特别是this answer)的讨论很有趣。