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这个字面量都预测出来,直接写到代码里面去了。

“VC++ inline 优化的试验” 只有一条评论

  1. 全能奔腾 在

    哇,大师手笔哇。C++是比较令人不爽,因为C++为了跑快而依赖的飙蛮的编译器会让人觉得自己智商很低。

留下您的评论