您的位置:首页 > 其它

编译器的优化问题

2009-10-13 22:13 218 查看
类似

for(int i=0;i<list.size();i++) {

...

}

编译器如何进行的优化。

代码:

#include <vector>

#include <windows.h>

using namespace std;

int main()

{

vector<int> a;

a.push_back(1);

char b[]="hello world";

for(int i=0;i<a.size();i++) {

a[i]++;

Sleep(100);

printf("%d",a[i]);

}

printf("%s",b);

return 0;

}

使用OllyDbg看了一下红色部分的汇编代码(使用的是visual studio 2005的release来编译的)



可以发现每一次循环都会执行一次求size的函数。因此对于下面这样的代码:

for(int i=0;i<list.size();i++) {

...

}

写成这样效率会更高

int l=list.size();

for(int i=0;i<l;i++) {

...

}

以前一直误以为编译器能帮忙进行这样的优化,看来是不可能的。

自己想想也可以明白。

因为编译器根本不知道size这个函数就是用来求长度的,即使知道,在循环中也无法检测有没有改变list的大小(很容易构造一堆调用和指针来改变list的大小又不让编译器检测出来)。

结论:不能过于依赖编译器,很多代码如果自己知道怎么优化还是要手动优化。

但是呢,我还是倾向于

for(int i=0;i<list.size();i++) {

...

}

这样的写法,因为这样的写法可读性比较强。

至于要如何写,只能根据实际情况,自己做权衡了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: