【问题标题】:Initializing array in C - execution time在 C 中初始化数组 - 执行时间
【发布时间】:2014-05-01 17:18:27
【问题描述】:
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循环初始化是否需要更多的执行时间?如果有,为什么?

【问题讨论】:

  • int[5] 只有 20 个字节,你为什么还要关心?
  • 这是为了学术目的...

标签: c arrays performance


【解决方案1】:

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

在带有gcc -O3(或者甚至可能是-O1-O2)的最新GCC(例如4.8 或4.9)上,这无关紧要,因为会发出相同的代码(GCC 甚至有一个优化可以改变你的循环到一个builtin_memset,这将被进一步优化)。

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

最好的办法是检查生成的(gimple 表示和)汇编代码(例如使用gcc -fdump-tree-gimple -O3 -fverbose-asm -mtune=native -S)并进行基准测试。大多数情况都没有关系。请务必在编译时启用优化。

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

【讨论】:

  • Clang 在-O3 下为两者生成完全相同的程序集输出。
  • 使用for循环我们每次都有一个计算(it
  • @KobiBurnley 没有优化,是的。编译器在每个循环中检查值
  • 另外值得注意的是,根据所使用的架构,可能会有 CPU 可用的操作,例如清零或设置大量字节(即:long long words 或 blocks of它们取决于边界对齐),这比循环遍历元素要快得多。如有疑问,请将其留给memset(),因为编译器可能会根据可用的内容进一步优化它。
【解决方案2】:

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

int a[5]={0};

可以在编译时完成,而循环在运行时运行。因此没有与前者相关的“执行”。

您可能会发现关于this question(尤其是this answer)的讨论很有趣。

【讨论】:

  • 我假设您指的是智能编译器会将全局静态数组放在.bss 段中,该段在程序执行之前归零。但实际的归零不是“在编译时”。编译器只是在目标文件中说:“给我这么多归零的内存”,实际上归零是 OS 的责任。不会真正影响答案,但我认为出于兴趣考虑值得考虑。
  • @Brendan - 是的,这就是我所说的。在我包含的链接中进行了更广泛的讨论。
猜你喜欢
  • 2020-12-18
  • 1970-01-01
  • 1970-01-01
  • 2010-12-18
  • 2012-05-31
  • 2023-03-13
  • 2012-04-03
相关资源
最近更新 更多