注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

还东国的博客

行之苟有恒,久久自芬芳

 
 
 

日志

 
 

在VC中和GCC中如何查看一个Inline函数是否成功  

2015-05-18 20:18:17|  分类: C++(VC)编程 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

VC中和GCC中如何查看一个Inline函数是否成功

在《提高C++性能的编程技术里》提到了Inline,那么如何实现它呢?在暇隙读书13里提到了可以使用三种方法:

class Example

{

public:

    void inlineOwner(){}

    inline char inlineDeclare() const;

    int inlineOut();

         int inlineComm();

};

//下面两个必须与头文件在一起,否则报链接错误

char Example:: inlineDeclare () const

{

    return 'w';

}

 

inline int Example ::inlineOut ()

{

    return 0;

}

//这个可以在CPP文件中

int Example::inlineComm()

{

}

 

#include "stdafx.h"

#include "Example.h"

 

int _tmain(int argc, _TCHAR* argv[])

{

         Example ea;

         ea. inlineOwner ();

         ea. inlineDeclare ();

         ea. inlineOut ();

         ea. inlineComm ();

         return 0;

}

这里大家就看出问题来了,普通的函数调用可以放到CPP文件中,而无论是内部声明还是外部定义前加inline都会要求在“调用点”能找到相应的实现函数。所以如果你把inlineDeclareinlineOut函数放到CPP文件中,编译器都会报一个链接的错误的。

其它到这里基本就可以明白,无论在类内声明还是在类外定义的方法都是可以真正实现inline的(具体的还看编译器)。但是为了更好的证明,还得再到汇编里看一下结果,如果汇编中有函数名称调用,则表示没有内联。好,设置一下VC编译器:

1CC++中“优化”使用O2,内联函数扩展使用_inline(/OB1)

2C++选项中“汇编程序输出”,选择“仅有程序集的列表(/FA)”

这其中会报几个错误:

1、命令行 error D8016 :/O2”和“/ZI”命令行选项不兼容

修改方法:“常规”-“调试信息格式”从“用于编辑并继续的程序数据库(/ZI)”改成“程序数据库(ZI)”

命令行 error D8016 :/O1”和“/RTC1”命令行选项不兼容

修改方法:“代码生成”-“基本运行时检查”改成“默认值”

这里再编译就可以生成Asm汇编文件,在里面搜索四个函数,发现前三个都找不到,而最后一个则可以找到好几个。

验证完成。

那么在G++或者GCC中呢?

在前面提到过,是在陈硕《Linux多线程服务端编程》中,P408页,看模板的短成员是不是被内联展开:

nm ./a.out  |grep size|C++filt

如果能搜索到Size函数,则表示是O0编译,否则为O2.同理也可验证内联。

至于林锐的声明处加Inline不能实现内联,再做一个测试:

inline int TestInline();

inline int TestCurInline()

{

         return 200;

}

int _tmain(int argc, _TCHAR* argv[])

{

         TestInline();

         TestCurInline();

         Sample sa;

         sa.inline01();

         sa.inline02();

         sa.inline03();

         sa.inline04();

         return 0;

}

int TestInline()

{

         return 100;

}

结果发现,确实如林锐所言。这就说明,在C++Primer中提到的声明和定义处都可以可能适用于类中或者不同的编译器,但是其原文“在函数声明或定义中的函数返回类型前加上关键字 inline 即把 min()指定成为 inline”真得在VS中是无法实现的。

细节,细节啊。还是得提高注意。

参考:http://bbs.csdn.net/topics/380059544

  评论这张
 
阅读(316)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017