哪个在C++中更快:i <= N或i <N + 1

Dim*_*imK 3 c++ performance for-loop

以下两个for循环都将执行N + 1次:

for(int i = 0; i <= N; ++i);
for(int i = 0; i < N + 1; ++i);
Run Code Online (Sandbox Code Playgroud)

两个表达式中的哪一个(i <= N或i <N + 1)计算速度更快?我知道有一个流行的类似问题(<快于<=?),但我认为这是不同的,因为我们在一个变量中加1,可能不是常数,然后将它与i进行比较,而不是比较它一个恒定的价值.

das*_*ght 5

首先,如果N是常量,则编译器N+1在编译时计算,并为两个选项生成相同数量的指令.本问答中解释了变量与常数比较的情况.

如果N变量的值仅在运行时可用,则运行在激进的优化级别的编译器也可以为两个比较生成相同的代码.

我运行了一个gcc-O3优化级别运行的实验,给它这两个代码片段:

scanf("%d%d", &j, &k);
if (j < k+1) {
    printf("hello\n");
}
Run Code Online (Sandbox Code Playgroud)

scanf("%d%d", &j, &k);
if (j <= k) {
    printf("hello\n");
}
Run Code Online (Sandbox Code Playgroud)

我曾经scanf阻止编译器完全优化表达式.

两种情况下产生的汇编代码相同:

movl    -8(%rbp), %eax
cmpl    -4(%rbp), %eax
jg      LBB0_2
Run Code Online (Sandbox Code Playgroud)

它相比jk,并跳过的呼叫printf(这优化与呼叫替换到puts)时j为大于k.

  • 做得好!永远不要假设编译器做什么.检查一下.对于N = 16和N = 17,它可以进行不同的编译,而无需理解原因.是的,发生在我身上. (2认同)