2014-05-01 14 views
0
int a[5] = {0}; 

VS用C初始化数组 - 执行时间

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

是否用于环路初始化通过花费更多的执行时间?如果是这样,为什么?

+1

'int [5]'只有20个字节,你为什么要关心? –

+0

它用于学术目的... –

回答

2

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

在最近的海湾合作委员会(如4.8或4.9)与gcc -O3(或者甚至可能-O1-O2)它不应该的问题,因为相同的代码将被发射(GCC更是把这将改变你的循环变成builtin_memset优化其会进一步优化)。

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

最好的办法是检查生成的(gimple representation和assembler)代码(例如使用gcc -fdump-tree-gimple -O3 -fverbose-asm -mtune=native -S)并进行基准测试。大部分情况并不重要。编译时一定要启用优化。

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

+1

Clang在'-O3'下产生完全相同的汇编输出。 – Kevin

+0

是否有任何意义的事实,在for循环中,我们每次都有一个计算(it

+1

@KobiBurnley没有优化,是的。编译器每循环检查一次值 – Kevin

1

它取决于变量的范围。对于静态或全局变量,可以在编译时完成第一次初始化,而循环运行在运行时,运行时。因此,没有与前者相关的“执行”。

您可能会对this question(特别是this answer)的讨论感兴趣。

+0

我假设你指的是一个聪明的编译器会将该全局静态数组放入'.bss'段中,在程序执行之前将其置零。但实际的调零不是“在编译时”。编译器只是在目标文件中说:“给我这么多的内存”,这是_OS的责任,实际上将它归零。并不真正影响答案,但我认为值得考虑出于兴趣。 – Brendan

+0

@布伦丹 - 是的,这就是我正在谈论的。在我所包含的链接中进行了更广泛的讨论。 – Floris