effective C++笔记之条款33: 明智地使用内联

原创 2012年03月21日 19:29:21

 

l        内联函数的基本思想在于将每个函数调用以它的代码体来代替。这种做法很可能会增加整个目标代码的体积。在一台内存有限的计算机里,过份地使用内联所产生的程序会因为有太大的体积而导致可用空间不够。过多的使用内联还会降低指令高速缓存的命中率,从而使取指令的速度降低,因为从主存取指令当然比从缓存要慢。

l        另一方面,如果内联函数非常短,编译器为这个函数体生成的代码就会真的比为函数调用生成的代码要小很多。内联这个函数将会确实带来更小的目标代码和更高的缓存命中率。

l        一个给定的内联函数是否真的被内联取决于编译器的具体实现。假设某个函数f并声明为inline,但是编译器决定不对它内联。则无论是新规则还是旧规则,如果内联函数没有被内联,每个调用内联函数的地方还得承担函数调用的开销;并且将该函数视为static,这样就消除了链接时的错误;如果是旧规则,还得承受代码体积的增加,因为每个包含内联函数的编译单元都有一份内联函数的代码及其静态变量的代码;新规则下则只有一个内联函数的外部拷贝。

关于内联函数的使用:

l        构造函数和析构函数常常不适合内联。

l        如果f是一个内联函数,修改它后,所有使用f的用户程序必须重新编译。相反,如果f不是内联函数,对f的修改仅需要用户重新链接,这就比需要重新编译大大减轻了负担;如果包含这个函数的程序库是动态链接的,程序库的修改对用户来说是完全透明的。

l        内联函数中的静态对象常常表现出违反直觉的行为。所以,如果函数中包含静态对象,通常要避免将它声明为内联函数。M26.

l        大多数调试器遇上内联函数都会无能为力。无法设置断点,无法单步调试。可以作为是否内联的决策根据之一。

l        一般来说,实际编程时最初的原则是不要内联任何函数,除非函数确实很小很简单。

l        一旦找出了程序中那些重要的函数,以及那些内联后可以确实提高程序性能的函数,就要毫不犹豫地声明为inline。同时,要注意代码膨胀带来的问题,并监视编译器的警告信息(48),看看是否有内联函数没有被编译器内联。

Effective C++ 条款33: 明智地使用内联

inline的意思:在编译期间将调用被调函数代替。函数中有静态成员,要避免声明为inline. 1. 内联函数,使用时不需要承担函数调用的开销。 缺点:增加代码体积,代码膨胀,可能导致不合理的...
  • xwp3211
  • xwp3211
  • 2013年07月13日 21:40
  • 431

《Effective C++》:条款28-条款29

条款28避免返回handles指向对象内部成分:指的是不能返回对象内部数据/函数的引用、指针等。 条款29为异常安全而努力是值得的:指的是要有异常处理机制,避免发生异常时造成资源泄露等问题。...
  • KangRoger
  • KangRoger
  • 2015年02月19日 19:47
  • 1393

Effective C++ 条款2

尽量以const、enum、inline替换#define首先,大家要明白一个道理。#define是什么,有什么作用。很简单,大家都知道#define实现宏定义,如下代码:#define Flag 1...
  • u011058765
  • u011058765
  • 2015年06月19日 12:06
  • 498

《Effective C++》:条款41-条款42

条款41了解隐式接口和编译期多态 条款42了解typename的双重意义条款
  • KangRoger
  • KangRoger
  • 2015年03月10日 22:13
  • 1240

《Effective C++》:条款44-条款45

条款44将与参数无关的代码抽离templates 条款45运用成员函数模板接受所有兼容类型...
  • KangRoger
  • KangRoger
  • 2015年03月12日 22:01
  • 1508

《Effective C++》资源管理:条款13-条款15

在系统中,资源是有限的,一旦用完必须归还给系统,否则可能会造成资源耗尽或其他问题。例如,动态分配的内存如果用完不释放会造成内存泄漏。 这里说的资源不仅仅是指内存,还包括其他,例如文件描述符、网络连接、...
  • KangRoger
  • KangRoger
  • 2015年01月14日 21:46
  • 1324

Effective Modern C++ 条款23 理解std::move和std::forward

Effective Modern C++ 条款23
  • big_yellow_duck
  • big_yellow_duck
  • 2016年08月30日 17:11
  • 1203

Effective C++ 条款15

在资源管理类中提供对原始资源的访问前面两节都在讨论如何管理资源,一般情况下,使用资源管理类来屏蔽原始资源,对抗内存泄露等问题,避免使用原始资源。这样我们就无法直接访问原本的原始资源。毕竟程序在有些时候...
  • u011058765
  • u011058765
  • 2015年06月24日 10:52
  • 669

《Effective C++》:条款38-条款39

条款38通过复合塑模树has-a 或根据某物实现出 条款39明智而审慎的使用private继承...
  • KangRoger
  • KangRoger
  • 2015年03月08日 21:32
  • 1154

《Effective C++》学习笔记——条款41

条款41、了解 隐式接口 和 编译期多态
  • lx417147512
  • lx417147512
  • 2016年03月07日 00:14
  • 348
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:effective C++笔记之条款33: 明智地使用内联
举报原因:
原因补充:

(最多只允许输入30个字)