c - for 循环比较中什么更快?

标签 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
} 

最佳答案

关于更快的唯一正确答案是:测量。

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

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

因此理论上,版本 2 比版本 1 更快,或者最坏的情况是相同的速度(最有可能用于常量表达式)。

关于c - for 循环比较中什么更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26775701/

相关文章:

c - 为什么这段代码要调用 rand() 两次才能获得至少 N 个随机位?

c - 指向结构体数组的指针

c - 使用 execv 命令 fork 和执行

c++ - 内联成员运算符与内联运算符 C++

Java伪尾调用递归产生更好的性能

performance - 最快的数学编程语言?

iphone - 在运行时测量和跟踪各种调用的性能的最佳方法是什么?

javascript - ajax调用不会同步执行

c - srand() 触发访问不在映射区域内

c - c中的sscanf函数用法