透彻了解inling的里里外外

inline函数,看起来像函数,动作像函数,比宏好用得多,可以调用它们又不需要受函数调用所招致的额外开销。
inline函数背后的整体观念是,将“对此函数的每一个调用"都以函数本体替代之。但是这样可能会增加你的目标码(object code)。过度热衷inlining会造成程序体积太大

inline只是对编译器的一个申请,不是强制命令。这项申请可以隐喻提出,也可以明确提出

  • 隐喻方式将函数定义于class定义式内:
class Person
{public:...int age() const { return theAge; } // 一个隐喻的inline申请...
private:int theAge;
}
  • 明确申明inline函数的做法则是在其定义式前加上关键字inline。
template<typename T>
inline const T& std::max(const T& a, const T& b)
{return a < b ? b : a;
}

大部分编译器拒绝将太过复杂的(带有循环或递归)函数inlining,而所有对virtual函数的调用也都会是linining落空。因为virtual因为"等待,知道运行期才确定调用哪个函数",而inline意味"执行前,先将调用动作替换成为被调用函数的本体。"

一个表面上看似inline的函数是否真的inline取决于运行环境,主要取决于编译器,幸运的是大多数表一起提供了一个诊断级别:
如果它们无法将你要求的函数inline化,会给出一个警告。

有时候虽然编译器有意愿inlining某个函数,还是可能为该函数生成一个函数本体。例如:
如果程序要去取某个inline函数的地址,编译器通常必须为此函数生成一个outlined函数本体。毕竟编译器没有能力提出一个指针指向并不存在的函数。

inline函数无法随着程序库的升级而升级。如果f是程序库内的一个inline函数,客户将"f函数本体"编进其程序中,一旦程序库设计这决定改变f,所有用到f的客户端程序都必须重新编译。如果f是non-inline函数,一旦又任何修改,客户端只需要重新连接就好,远比重新编译的负担少。如果程序采用动态连接,升级版函数甚至可以不知不觉地被应用程序吸纳。

大部分调试器面对inline函数都束手无策。因为没办法在一个并不存在的函数内设立断点。虽然某些环境中勉强支持对inline函数的调试,其他许多环境仅仅只能"在调试版程序中禁用发生inlining"。

请记住:

  • 将大多数inlining限制在小型、被频繁调用的函数身上。这可使日后的调试过程和二进制升级更容易,也可使潜在的代码膨胀问题最小化,使程序的速度提升机会最大化。
  • 不要只以为funciton template出现在头文件,就将它们声明为inline。

30. Understand the ins and outs of lining相关推荐

  1. Effective C++条款30:透彻了解inlining的里里外外(Understand the ins and outs of inlining)

    Effective C++条款30:透彻了解inlining的里里外外(Understand the ins and outs of inlining) 条款30:透彻了解inlining的里里外外 ...

  2. Effective C++ 改善55个方法

    美·Scott Meyers 候捷 电子工业 2011 刚才看到个会议时间有点晚,3.25论文都提交了 谷歌去广告的插件, 最后投了这个会议,刚刚好正合适.我说金钱与时间 ACCUSTOMING YO ...

  3. Effective C++读书摘要--Implementations二

    <Item29> Strive for exception-safe code. 1.如下面的代码 class PrettyMenu { public:...void changeBack ...

  4. Effective C++ 读书笔记之Part5.Implementations

    26. Postpone variable definitions as long as possible. 总结: 尽可能延后变量定义式的出现.这样做可增加程序的清晰度并改善程序效率. 批注: 纯C ...

  5. Effective C++ 中文版(第三版)读书笔记 更新ing~

    Effective C++ 中文版(第三版)持续更新ing 让自己习惯C++ 条款1 视c++为一个联邦 条款2 尽量以const,enum,inline替换#define 条款3 尽可能使用cons ...

  6. Effective C++改善程序与设计的55个具体做法笔记

    Scott Meyers大师Effective三部曲:Effective C++.More Effective C++.Effective STL,这三本书出版已很多年,后来又出版了Effective ...

  7. 在线学位课程_如何选择计算机科学学位课程

    在线学位课程 by Colin Smith 通过科林·史密斯 如何选择计算机科学学位课程 (How to choose a Computer Science degree program) I rem ...

  8. fcn从头开始_如何使用Go从头开始构建区块链

    fcn从头开始 介绍 (Introduction) With Web 3.0 and blockchain becoming more mainstream every day, do you kno ...

  9. 学ios 需要学html5me,针对iOS平台移植Flash内容的指导教程(1)

    针对iOS平台移植Flash内容的指导教程(1) 发布时间:2011-12-07 15:18:16 Tags:Mac,在iOS平台开发Flash内容,指导教程 作者:Sina Kashanizadeh ...

  10. android安全开发_现代android安全开发

    android安全开发 第一次(错误)练习 (1st (Mistake) Practice) Given the "find out how to en-decrypt data in An ...

最新文章

  1. Office协同办公:SkyDrive
  2. Spring Boot 自动配置之条件注解
  3. ASIHTTPRequest的环境配置和使用示例
  4. python做方差分析和卡方检验
  5. 100家店干翻17000家药店!刘强东最恐惧的对手来了!
  6. linux网络协议栈 转发组播,Linux 网络协议栈开发基础篇(十)—— 组播(Multicast)基础...
  7. life words
  8. java 获取jboss路径_java中获取文件路径的几种方式
  9. C#的一些方法读程序转c++
  10. 用HTML和CSS制作简单的静态网页
  11. dmac学习之基于LLI的multi block tranfer验证
  12. Linux 配置SSH免密登录
  13. mybatis 一对一、一对多、多对一、多对多
  14. c++_设计一个 Studnet(学生)类
  15. MySql数据库-58沈剑 架构师之路
  16. matlab方程求解的实验报告,用matlab对微分方程求解实验报告.doc
  17. 【Java异常】Cannot deserialize value of type `java.util.Date` from String “2020-04-27T19:43:05.000+0800
  18. 提升Facebook触及率和互动率攻略 | 智能客服帮您抓住用户的心
  19. C语言学习日志 day1
  20. 网页播放flv格式的视频

热门文章

  1. 20155229 2017-2018-1 《信息安全系统设计基础》课程总结
  2. Android项目文件的目录结构(1)
  3. Session 的几种存储方式及优缺点
  4. 10.Kong入门与实战 基于Nginx和OpenResty的云原生微服务网关 --- 内置插件
  5. 2.微服务:从设计到部署 --- 使用 API 网关
  6. 5.程序员的自我修养---Windows PE/COFF
  7. 20.从0开始的微服务架构
  8. 11. Window open() 方法
  9. php中global与$_GLOBALS[]的区别
  10. 安全运维 - Linux系统攻击应急响应