使用printf而不是cout时,循环优化不太积极

时间:2018-02-13 10:17:26

标签: c++ gcc compiler-optimization

这个问题是这个问题的后续问题: Question on Undefined Behaviour (UB) and loop optimization

当使用https://godbolt.org/在线编译器(g ++ 7.2,x86_64)并设置-O2时,循环条件会在循环包含std::cout但不使用{printf的相同循环时优化出来1}}。

知道为什么吗?两个代码版本都使用C ++编译器编译。两个版本都会产生UB警告,但没有-O2就没有警告,即使代码仍在UB中。

FWIW,我也尝试过MIPS g ++编译器,即使使用std::cout代码版本和-O2,也似乎没有优化循环条件。

如果需要,我可以提供编译器输出,但std::cout版本很长。

#include <stdio.h>
int main()
{
    for (int i = 0; i < 300; i++)
        printf("%d %d", i, i*12345678);
}

/*#include <iostream>                                                                                                                                                                                                                                                                     
int main()                                                                                                                                                                                                                                                                                
{                                                                                                                                                                                                                                                                                         
    for (int i = 0; i < 300; i++)                                                                                                                                                                                                                                                         
        std::cout << i << " " << i * 12345678 << std::endl;                                                                                                                                                                                                                               
}*/

更新:根据评论的建议,我删除了UB,然后甚至printf版本删除了循环条件,而是在我11岁时跳出循环(非常不足为奇),见下文:

#include <stdio.h>
int main()
{
    for (int i = 0; i < 300; i++) {
        printf("%d %d", i, i*123); 
        if (i * 123 > 1230) break;
    }
}

//生成的程序集:

LC0:
.string "%d %d"
main:
  push rbp
  push rbx
  xor edx, edx
  xor esi, esi
  mov edi, OFFSET FLAT:.LC0
  xor eax, eax
  sub rsp, 8
  mov ebp, 123
  xor ebx, ebx
  call printf
.L2:
  add ebx, 1
  mov edx, ebp
  xor eax, eax
  mov esi, ebx
  mov edi, OFFSET FLAT:.LC0
  add ebp, 123
  call printf
  cmp ebx, 11
  jne .L2
  add rsp, 8
  xor eax, eax
  pop rbx
  pop rbp
  ret

0 个答案:

没有答案