我的猜测是在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
}
答案 0 :(得分:1)
sizeof
仅在运行时进行 评估。
由于情况并非如此,它只是一个编译时间常数,您将获得相同的性能。
答案 1 :(得分:1)
更快的唯一真正答案是:衡量。
也就是说,在版本1中,您在循环的每次迭代中评估并结束条件,而在版本2中,您只评估它一次。
如果编译器可以将常量值直接放在寄存器中以便在版本1中进行比较,那么即使sizeof是常量,它也可能在版本2中执行相同的操作。
因此版本2在理论上要么比版本1更快或最差,速度与版本1相同(最常见的是表达式)。