最近学了点汇编,虽然写不出什么代码,但是好歹看懂一点了。于是突然想去看看C++对代码优化到什么程度。
首先看debug,debug是完全没有什么优化了,除此之外还加了很多检测的过程,难怪效率那么低。
后来看Release,优化得很彻底,用不到的变量,全部去掉比如 int a=0;a++;
不管你对a进行了什么操作,你最终没有真正使用它,那么就会除掉,这个大概不算什么,是个人都知道的道理。
比较令我惊讶的是对函数的优化。如果调用库函数,那就是只能老老实实call了,但是调用自己定义的函数,几乎都是自己内联展开。之前看到说使用inline才会展开的说法根本站不住脚,或者说简单的语句才会展开,不过什么的简单的语句其实很难说,至少别人说的有循环就不会内联是完全不对了,C++一样给展开掉。即使函数声明和实现不在同一个文件,还是会被展开。我还没尝试怎么样的情况才不会被展开,感觉大部分情况都会被展开吧,需要多研究。
另外还有一种情况就是类似
for(int i=0;i<10;i++)a++;这样的语句,很明显,如果你去优化,肯定直接就是a+=10;实际上编译器也是这么优化的。
看来C++之所以快,很大程度是编译器避开了我们的愚蠢,不过从这个角度来说,我之前所做的很多看似优化的优化,其实都没多少用处,还不如按顺手的方式来写。
不知道除了C++,其他语言类似C#、Java有没有这样的机制,感觉就算有可能也没那么彻底吧,毕竟那些语言还有错误检查,减少了Crash的概率,省去了编译的时间,代价就是性能上的损失