编译器比你聪明


#62

不错不错!

很多无知的码农喜欢用>>来做一些"优化",结果就是博士所说的,一堆shit一样的代码出来了。。。

因为你用位移去写代码,读代码的人还在在脑子里稍做运算一下,这样就会中断思维,远不及*或/直观清晰。


#63

这是老师洗脑的,却不知道编译器已经做了。


#64

这个要看是什么编译器,还要看他的优化参数吧?


#65

C++ 编译器强大啊… 对于其他的语言来讲, 可能就没有那么幸运了吧?


#66

那是, 世界上多少人在研究 C++ 的优化,没有几个人会去研究冷门的啥 ruby啊python啊这种垃圾的优化的


#67

再来一个上面那个函数的所谓 手工优化 的版本

事实上, 生成的代码更糟糕!!


结论

  • 当编译无法清晰的知晓你的意图的时候就无法优化

#68

这个太烂了,差点都看不懂。。。


#69

尾递归优化

提示

  • 编译器生成了非递归代码
  • 老版本的VC编译器不能

#70

所以编译器也没看懂, 导致优化不给力


#71

C++编译器居然支持尾递归。。。。?????!!!!


#72

这说明应该尽量的使用最新版本的编译器来编译自己的项目。


#73

居然这都可以。我之前还跟老板吹嘘这种递归不能写,效率太低。。。哈哈


#74

难道说Scala就是Java版的C++?


#75

下面是一段来自某视频解码器的代码, 呵呵, 至于是哪个 著名的开源视频解码器 … 自己 YY 去

提示:

  • 第一个代码是 某视频解码器的代码
  • 最后一个版本是遵守内心的呼唤写出的最原始的未优化代码
  • 最后一个版本生成的汇编代码是最高效的

注意看, 前面两种代码, 编译器生产 2次移位两次或 的代码, 这显然在 P4 平台要比一次乘法指令高效. 可是, 在现代的 CPU 上, 一次乘法要比 2次移位两次或 高效. 使用最后一种写法, 编译器在 P4 平台自动的选定 2次移位两次或 的算法, 而在现在 CPU 上使用的就是简单的一次乘法!

看来编译器比写视频解码器的人都要厉害, 他们不是经常为了性能用汇编的么?


#76
/// 使用 gcc -O2以上的优化,才能使用尾递归
#include <iostream>

int fun2(int sum, int n)
{
	if(n == 0)
		return sum;
	return fun2(sum + n, n-1);
}

int fun(int n) {
	return fun2(0, n);
}

int main()
{
	std::cout << fun(100000);
}

#77

提示: •第一个代码是 某视频解码器的代码 •最后一个版本是遵守内心的呼唤写出的最原始的未优化代码 •最后一个版本生成的汇编代码是最高效的

看来编译器比写视频解码器的人都要厉害, 他们不是经常为了性能用汇编的么?

这种优化针对 平台的吧???????ARM或者单片机上面的两种还是好一点的吧!!!???求解释!


#78

接下来是群众 喜闻乐见的 for VS while

提示:

  • for 和 while 生成一模一样的代码, 另外在开启优化的情况下, 编译器自动将循环循环适量化

#79

这两个的执行顺序是一样的。应该没有什么差别。


#80

事实上是最后一种编译器总能根据平台选择最佳指令.

而上面的代码只能在特定的平台生产优化的代码.


#81

注意看, 前面两种代码, 编译器生产 2次移位两次或 的代码, 这显然在 P4 平台要比一次乘法指令高效.

可是, 在现代的 CPU 上, 一次乘法要比 2次移位两次或 高效.

使用最后一种写法, 编译器在 P4 平台自动的选定 2次移位两次或 的算法, 而在现在 CPU 上使用的就是简单的一次乘法!