for循环比较的速度更快?

时间:2014-11-06 09:21:52

标签: c performance

我的猜测是在c89版本1中更快,因为sizeof是编译时运算符,因此我们将与常量进行比较。但是在c99中我们可以将sizeof作为VLA,因此sizeof是运行时运算符。 那么哪一个在c99中更快? 哪一个在c89中更快?

两者的一个定义和数组:

#define NUM_ROWS(x) (int) (sizeof(x) / sizeof((x)[0]))

int x[5] = { 0 };

版本1:

int i;
for (i = 0; i < NUM_ROWS(x); i++) { 
    // code
}

第2版:

const int length = NUM_ROWS(x);
int i;
for (i = 0; i < length; i++) { 
    // code
} 

2 个答案:

答案 0 :(得分:1)

如果VLA是表达式的一部分,则

sizeof仅在运行时进行 评估。

由于情况并非如此,它只是一个编译时间常数,您将获得相同的性能。

答案 1 :(得分:1)

更快的唯一真正答案是:衡量。

也就是说,在版本1中,您在循环的每次迭代中评估并结束条件,而在版本2中,您只评估它一次。

如果编译器可以将常量值直接放在寄存器中以便在版本1中进行比较,那么即使sizeof是常量,它也可能在版本2中执行相同的操作。

因此版本2在理论上要么比版本1更快或最差,速度与版本1相同(最常见的是表达式)。