张成岗(CZ)的博客世界分享 http://blog.sciencenet.cn/u/zcgweb 脑损伤与脑保护;神经认知;生物信息;蛋白质组;辐射损伤与防护

博文

[转载]现代C/C++编译器有多智能?能做出什么厉害的优化?

已有 115 次阅读 2021-4-14 12:26 |系统分类:科研笔记|文章来源:转载

https://www.zhihu.com/question/43598164/answer/96118643?utm_source=com.doc360.client&utm_medium=social&utm_oi=711850675998298112


现代C/C++编译器有多智能?能做出什么厉害的优化?

最近在搞C/C++代码的性能优化,发现很多时候自以为的优化其实编译器早就优化过了,得结合反汇编才能看出到底要做什么样的优化。
请熟悉编译器的同学结合操作系统和硬件谈一谈现代c/c++编译器到底有多智能吧。哪些书本上的优化方法其实早就过时了?
以及程序员做什么会让编译器能更好的自动优化代码?

举个栗子:
1,循环展开,大部分编译器设置flag后会自动展开;
2,顺序SIMD优化,大部分编译器设置flag后也会自动优化成SIMD指令;
3,减少中间变量,大部分编译器会自动优化掉中间变量;
etc.

查看代码对应的汇编:
Compiler Explorer


苏远

谷歌程序员

443 人赞同了该回答

举个微小的例子,一到一百求和

#include <stdio.h> 
int sum() {
  int ret= 0;
  int i;
  for(i = 1; i <= 100; i++) ret+=i;
  return ret;
}
int main() {
  printf("%d\n", sum());
  return 0;
}


不开优化编译,汇编代码还挺正常的,乖乖做loop
.LBB0_1: # =>This Inner Loop Header: Depth=1
cmpl $100, -8(%rbp)
jg .LBB0_4
# BB#2: # in Loop: Header=BB0_1 Depth=1
movl -8(%rbp), %eax
movl -4(%rbp), %ecx
addl %eax, %ecx
movl %ecx, -4(%rbp)

开优化再看看汇编,clang -O2 -S sum.c
output:
# BB#0:
movl $5050, %eax # imm = 0x13BA
ret
...
.Ltmp2:
.cfi_def_cfa_offset 16
movl $.L.str, %edi
movl $5050, %esi # imm = 0x13BA
xorl %eax, %eax
callq printf
xorl %eax, %eax
popq %rdx
ret

卧槽,5050是个什么鬼!编译器大哥你能不能严肃点,直接把结果算出来是怎么回事。
编译器:算一加到一百都要写循环,妈的智障。

介于编译器会高斯求和法,估计大约是高斯十岁的水平【大误




http://wap.sciencenet.cn/blog-40692-1281919.html

上一篇:[转载]2018.03.14,科学家从「鼻涕虫」提炼蛋白胶,粘性能够把心脏的大伤口粘合
下一篇:[转载]2016.01.21,植物能产生氢气

0

该博文允许注册用户评论 请点击登录 评论 (4 个评论)

数据加载中...

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2021-6-20 14:30

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部