VC++ inline 优化的试验
2013年2月24日
今天试了一下VC++对于inline的优化是如何做的。主要是因为近段日子在手机上看Effective C++的缘故。
==test1.h==
class Test1
{
public:
Test1();
~Test1();
inline int GetXFromH() { return x; }
inline int GetXFromCPP();
private:
int x;
};
==test1.cpp==
#include “test1.h”
#include <stdio.h>
Test1::Test1()
{
x = 10;
}
Test1::~Test1()
{
x = -1;
}
inline int Test1::GetXFromCPP()
{
return x;
}
int main(void)
{
Test1 t;
printf(“%d\n”, t.GetXFromH());
printf(“%d\n”, t.GetXFromCPP());
return 0;
}
==
首次试验:
– 在CPP文件中使用inline
– 在H文件中不使用inline
– VC++6.0编译器
– 编译时不指定/O2
命令是:vcrun cl /c /Faoutput.s test1.cpp。
结果:在汇编代码output.s中没有发现内联。仍然调用了GetXFromH和GetXFromCPP。
第二次试验:
– 在CPP文件中使用inline
– 在H文件中使用inline
– VC++6.0编译器
– 编译时不指定/O2
命令是:vcrun cl /c /Faoutput.s test1.cpp。
结果:在汇编代码output.s中没有发现内联。仍然调用了GetXFromH和GetXFromCPP。
第三次试验:
– 在CPP文件中使用inline
– 在H文件中使用inline
– VC++6.0编译器
– 编译时指定/O2
命令是:vcrun cl /O2 /c /Faoutput.s test1.cpp。
结果:在汇编代码output.s中发现了内联。
第四次试验:
– 在CPP文件中不使用inline
– 在H文件中使用inline
– VC++6.0编译器
– 编译时指定/O2
命令是:vcrun cl /O2 /c /Faoutput.s test1.cpp。
结果:在汇编代码output.s中发现了内联。
由上述分析可见,inline只要在头文件中指定即可,另外/O2开关要打开才行。对于VC++ 2005来说,在打开/O2开关的情况下,甚至它把10这个字面量都预测出来,直接写到代码里面去了。
哇,大师手笔哇。C++是比较令人不爽,因为C++为了跑快而依赖的飙蛮的编译器会让人觉得自己智商很低。