Effective C++ Item 30 inline里里外外

本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie

Item 44 46

1.将大多数 inlining 限制在小型、被频繁调用的函数身上。这可使日后的调试过程和二进制升级更容易,

也可使潜在的代码膨胀问题最小化,使程序的速度提升机会最大化。

2.inline是对编译器的一个申请。

隐喻方式:将函数定义于 class 定义式内, 如成员函数或 friend 函数

明确声明:在定义式前加关键字 inline

编译器会拒绝大过复杂的函数 inlining, 而所有对 virtual 函数的调用也都会使 inlining 落空。

因为 virtual 意味 ”等待,直到运行期才确定调用哪个函数“, 而 inline 意味”执行前,先将调用动作替换为被调用函数的本体“。

3.虽然编译器有意愿 inlining 某个函数,还是可能为该函数生成一个 outlined 函数本体。

正常调用可以inlined, 通过函数指针的调用或许不被 inlined

inline void f() {...} //假设编译器有意愿 inline "对f的调用"
void (*pf)() = f; //pf指向 f
//...
f(); //这个调用将被 inlined,因为它是一个正常调用。
pf();//这个调用或许不被 inlined,因为它通过函数指针达成。

4.不要只因为 function templates 出现的头文件,就将它们声明为 inline

Inline 函数通常一定被置于头文件内,因为大多数建置环境在编译过程中进行inlining,而为了将一个“函数调用”

替换为“被调用函数函数的本体”,嘎嘎必须知道那个函数长什么样子。

Templates 通常也被置于头文件内,因为它一旦被使用,编译器为了将它具体化,需要知道它长什么样子。

但 Template 的具体化与 inlining无关,不要只因为 function templates 出现的头文件,就将它们声明为 inline。

5.inline函数f:一旦改变f,所有用到f的客户端面程序都必须重新编译

non-inline函数:一旦改变f,客户端只需重新连接。

Effective C++ Item 30 inline里里外外

时间: 2024-12-20 15:41:15

Effective C++ Item 30 inline里里外外的相关文章

读书笔记 effective c++ Item 30 理解内联的里里外外 (大师入场啦)

最近北京房价蹭蹭猛涨,买了房子的人心花怒放,没买的人心惊肉跳,咬牙切齿,楼主作为北漂无房一族,着实又亚历山大了一把,这些天晚上睡觉总是很难入睡,即使入睡,也是浮梦连篇,即使亚历山大,对C++的热情和追求还是不减,应该是感动了周公吧,梦境从此处开始,大师入场来给我安慰了... 11点躺在床上了,脑子里总结一下最近的工作:最近的开发用到inline函数比较多,众所周知,inline的使用是为了提高程序性能,可结果却总不尽如人意,这个捉急啊,嗯?怎么突然到了山脚下,周边树木林立,郁郁葱葱,鸟儿委婉啼叫

Effective JavaScript Item 30 理解prototype, getPrototypeOf和__proto__的不同

本系列作为Effective JavaScript的读书笔记. prototype,getPropertyOf和__proto__是三个用来访问prototype的方法.它们的命名方式很类似因此很容易带来困惑. 它们的使用方式如下: prototype: 一般用来为一个类型建立它的原型继承对象.比如C.prototype = xxx,这样就会让使用new C()得到的对象的原型对象为xxx.当然使用obj.prototype也能够得到obj的原型对象. getPropertyOf: Object

Effective C++ Item 2 尽量以const, enum, inline 替换 #define

本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie 尽量以const, enum,inline 替换 #define --> 宁可以编译器替换预处理器 1.对于单纯常量,最好以const 对象或enum替换#define 不要用 #define ASPECT_RATIO 1.653 而用 const doube AspectRatio = 1.653 两个使用const的特殊情况 1.指向常量char *的字符串的常量指针 const ch

读书笔记 effective c++ Item 44 将与模板参数无关的代码抽离出来

1. 使用模板可能导致代码膨胀 使用模板是节省时间和避免代码重用的很好的方法.你不需要手动输入20个相同的类名,每个类有15个成员函数,相反,你只需要输入一个类模板,然后让编译器来为你实例化20个特定的类和300个你需要的函数.(只有在被使用的情况下类模版的成员函数才会被隐式的实例化,所以只有在300个函数被实际用到的情况下才会生成300个成员函数.)函数模板同样吸引人.你不用手动实现许多函数,你只需要实现一个函数模板,然后让编译器来做余下的事情. 然而在有些时候,如果你不小心,使用模板会导致代

读书笔记 effective c++ Item 46 如果想进行类型转换,在模板内部定义非成员函数

1. 问题的引入——将operator*模板化 Item 24中解释了为什么对于所有参数的隐式类型转换,只有非成员函数是合格的,并且使用了一个为Rational 类创建的operator*函数作为实例.在继续之前建议你先回顾一下这个例子,因为这个条款的讨论是对它的扩展,我们会对Item 24的实例做一些看上去无伤大雅的修改:对Rational和opeartor*同时进行模板化: 1 template<typename T> 2 class Rational { 3 public: 4 Rati

Effective C++ Item 31 降低文件间编译依存关系

本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie 经验:支持"编译依存性最小化"的一般构想是:相依于声明式,不要相依于定义式. 基于此构想的两个手段是 Handle classes 和 Interface classes. 示例:相依于定义式 #include <string> #include "date.h" #include "address.h" class Perso

Effective C++ Item 3 尽可能使用const

本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie const 出现在*左边指const data,出现在*右边指const pointer char greeting[] = "Hello"; char *p = greeting; //non-const pointer, non-const data const char *p = greeting; //non-const pointer, const data char

Effective C++ Item 5 了解 C++ 默默编写并调用哪些函数

本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie 经验: 如果你自己没声明,编译器会自动声明copy constructor,copy assignment,destructor, 如果你没有声明任何构造函数,编译器会自动声明default constructor 示例: 如果你写下 class Empty{ }; 将会等价于 class Empty{ public: Empty() {...} //default构造函数 Empty(c

Effective C++ Item 6 若不想使用编译器自动生成的函数,就该明确拒绝

本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie 为驳回编译器自动提供的机能,可将相应的成员函数声明为private并且不予实现.使用像Uncopyable这样的base class也是一种方法 classUncopyable{ protected: //允许derived对象构造和析构 Uncopyable(){} ~Uncopyable(){} private: Uncopyable(constUncopyable&); //但阻止c