int a[5] = {0};
typedef struct
{
int a[5];
} ArrStruct;
ArrStruct arrStruct;
sizeA = sizeof(arrStruct.a)/sizeof(int);
for (it = 0 ; it < sizeA ; ++it)
arrStruct.a[it] = 0;
是否用于环路初始化通过花费更多的执行时间?如果是这样,为什么?
int a[5] = {0};
typedef struct
{
int a[5];
} ArrStruct;
ArrStruct arrStruct;
sizeA = sizeof(arrStruct.a)/sizeof(int);
for (it = 0 ; it < sizeA ; ++it)
arrStruct.a[it] = 0;
是否用于环路初始化通过花费更多的执行时间?如果是这样,为什么?
它取决于编译器和优化标志。
在最近的海湾合作委员会(如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
)并进行基准测试。大部分情况并不重要。编译时一定要启用优化。
一般来说,不关心这样的微观优化;一个好的优化编译器比你有时间编码要好。
它取决于变量的范围。对于静态或全局变量,可以在编译时完成第一次初始化,而循环运行在运行时,运行时。因此,没有与前者相关的“执行”。
您可能会对this question(特别是this answer)的讨论感兴趣。
'int [5]'只有20个字节,你为什么要关心? –
它用于学术目的... –