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

还东国的博客

行之苟有恒,久久自芬芳

 
 
 

日志

 
 

暇隙读书(13)——内联的内涵读《提高C++性能的编程技术》  

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

  下载LOFTER 我的照片书  |

暇隙读书(13)——内联的内涵读《提高C++性能的编程技术》

在这本书中,第八、九、十三章都是讲内联的使用和分析,那么内联是怎么回事呢?是普遍支持的还是有选择的支持呢?

C++和最新的C99Gun C中都是支持内联的,但是在其它的C版本里,特别是最常用的Ansi C89中是不支持的。大家一定要引起注意。

这里只讲C++的内联,那么在C++中如何实现内联呢?

1. 将函数的定义写在类定义的内部;

2. 在类定义内部的函数声明上用inline显式指定;

第二条说明:在C++Primer和林锐的书上是有些矛盾的,前者说在声明和定义前加Inline都可以,但后者说只能在定义处实现。目前尚未找到更权威的书籍来证实。

详细说明见下一篇博文“在VC中和GCC中如何查看一个Inline函数是否成功 

3. 在类定义体外部的函数实现上用inline显式指定;

看代码:

class Example

{

public:

    void inlineOwner(){}

    inline char inlineDeclare() const;

    int inlineOut();

};

 

char Example:: inlineDeclare () const

{

    return 'w';

}

 

inline int Example ::inlineOut ()

{

    return 0;

}

程序很简单,但有一点得细说:在上面提到了到底是在声明里Inline还是在定义处Inline,经过在VS2010中测试(仅限于2010的编译器):

这三种情况都可以生成。更详细的见下一篇博文。

说一说一些细节,其实使用Inline这个关键字只是提示编译器可以做内联,但是真正可不可心内联成功,编译器并不是完全听它的。这个和具体的编译器是有关系的。举一个简单的例子,对于主流的编译器来说,如果函数内部有While等循环或者Switch语句,即使你声明了使用内联,编译器也不会内联的。

当然,其它还有虚函数的静态变量等。甚至对虚函数,也是看具体的编译器是否支持。

内联的好处是显而易见的,但是为什么不广泛的使用内联呢?

因为内联还是有比较明显的缺点的:

1、代码膨胀引起的CPU指令周期的增加。

2、代码膨胀引起页面缓存错误导致性能锐减。

3、循环和递归调用引起的代码大爆炸。

那好,其它的就简单说一下,其中一个是如果能够缩减代码大小的内联都是可取的,而任何显著增加代码大小的内联都是不可取的。另外一个是是如果方法的实现是易变的,则不应该将其内联。

那么内联有一些什么技巧呢?

1、条件内联:可以使用宏之类的条件编译选项决定何时使用内联。

2、选择性内联:这个不细讲,在C++中对这个支持非常弱,但这本书上采用了一些替代的方法来实现。

3、递归内联:通过分解递归来实现简单的内联,牺牲代码量,提高执行速度。

那么在使用内联时要注意哪些问题呢?

1、在一个文件中定义的内联函数不能在另一个文件中使用。它们通常放在头文件中共享。

2、内联函数应该简洁,只有几个语句,如果语句较多,不适合于定义为内联函数。

3、内联函数体中,不能有循环语句、if语句或switch语句,否则,函数定义时即使有inline关键字,编译器也会把该函数作为非内联函数处理。

4、内联函数要在函数被调用之前声明。关键字inline 必须与函数定义体放在一起才能使函数成为内联,仅将inline 放在函数声明前面不起任何作用。

5如果在类体外定义inline函数,则必须将类定义和成员函数的定义都放在同一个头文件中(或者写在同一个源文件中),否则编译时无法进行置换(将函数代码的拷贝嵌入到函数调用点)

到这里,基本这本书就过完了,下来抽时间看一下《尝试探索C++对象模型》,好好学习,热爱读书。

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

历史上的今天

在LOFTER的更多文章

评论

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

页脚

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