C++关键字 inline

在C&C++中

一、inline关键字用来定义一个类的内联函数,引入它的主要原因是用它替代C中表达式形式的宏定义。

表达式形式的宏定义一例:

#define ExpressionName(Var1,Var2) ((Var1)+(Var2))*((Var1)-(Var2))

取代这种形式的原因如下:

1. C中使用define这种形式宏定义的原因是因为,C语言是一个效率很高的语言,这种宏定义在形式及使用上像一个函数,但它使用预处理器实现,没有了参数压栈,代码生成等一系列的操作,因此,效率很高,这是它在C中被使用的一个主要原因。

2. 这种宏定义在形式上类似于一个函数,但在使用它时,仅仅只是做预处理器符号表中的简单替换,因此它不能进行参数有效性的检测,也就不能享受C++编译器严格类型检查的好处,另外它的返回值也不能被强制转换为可转换的合适的类型,这样,它的使用就存在着一系列的隐患和局限性。

3. 在C++中引入了类及类的访问控制,这样,如果一个操作或者说一个表达式涉及到类的保护成员或私有成员,你就不可能使用这种宏定义来实现(因为无法将this指针放在合适的位置)。

4. inline 推出的目的,也正是为了取代这种表达式形式的宏定义,它消除了宏定义的缺点,同时又很好地继承了宏定义的优点。

预定义

对应于上面的1-3点,阐述如下:

1. inline 定义的类的内联函数,函数的代码被放入符号表中,在使用时直接进行替换,(像宏一样展开),没有了调用的开销,效率也很高。

2. 很明显,类的内联函数也是一个真正的函数,编译器在调用一个内联函数时,会首先检查它的参数的类型,保证调用正确。然后进行一系列的相关检查,就像对待任何一个真正的函数一样。这样就消除了它的隐患和局限性。

3. inline 可以作为某个类的成员函数,当然就可以在其中使用所在类的保护成员及私有成员。

在何时使用inline函数:

首先,你可以使用inline函数完全取代表达式形式的宏定义。

另外要注意,内联函数一般只会用在函数内容非常简单的时候,这是因为,内联函数的代码会在任何调用它的地方展开,如果函数太复杂,代码膨胀带来的恶果很可能会大于效率的提高带来的益处。内联函数最重要的使用地方是用于类的存取函数。

使用方法

简单提一下inline 的使用吧:

1.在类中定义这种函数:

class ClassName{

.....

....

INT GetWidth(){return m_lPicWidth;}; // 如果在类中直接定义,不需要用inline修饰,编译器自动化为内联函数

.... //此说法在《C++ Primer》中提及

....

}

2.在类外定义前加inline关键字:


1

2

3

4

5

6

7

8

9

10

11

12

class Account {

public:

Account(double initial_balance) { balance = initial_balance; } //与1相同

double GetBalance(); //在类中声明

double Deposit( double Amount );

double Withdraw( double Amount );

private:

double balance;

};

inline double Account::GetBalance() { return balance; } //在类外定义时添加inline关键字

inline double Account::Deposit( double Amount ) { return ( balance += Amount ); }

inline double Account::Withdraw( double Amount ) { return ( balance -= Amount ); }

此外还有一些规则需注意:

1、inline说明对编译器来说只是一种建议,编译器可以选择忽略这个建议。比如,你将一个长达1000多行的函数指定为inline,编译器就会忽略这个inline,将这个函数还原成普通函数。

2、在调用内联函数时,要保证内联函数的定义让编译器"看"到,也就是说内联函数的定义要在头文件中,这与通常的函数定义不一样。但如果你习惯将函数定义放在CPP文件中,或者想让头文件更简洁一点,可这样做:


1

//SomeInline.h中


1

2

3

4

5

6

7

8

9

10

11

12

13

#ifndef SOMEINLINE_H

#define SOMEINLINE_H

inline Type Example(void);

//........其他函数的声明

#include"SomeInlie.cpp" //源文件后缀名随编译器而定

#endif

//SomeInline.cpp中

#include"SomeInline.h"

Type Example(void)

{

//..........

}

//...............其他函数的定义

以上方法是通用、有效的,可放心使用,不必担心在头文件包含CPP文件会导致编译错误。

时间: 2024-10-11 19:53:03

C++关键字 inline的相关文章

转:C++ 关键字 inline详细介绍

1.  内联函数 在C++中我们通常定义以下函数来求两个整数的最大值: int max(int a, int b) { return a > b ? a : b; } 为这么一个小的操作定义一个函数的好处有: ① 阅读和理解函数 max 的调用,要比读一条等价的条件表达式并解释它的含义要容易得多 ② 如果需要做任何修改,修改函数要比找出并修改每一处等价表达式容易得多 ③ 使用函数可以确保统一的行为,每个测试都保证以相同的方式实现 ④ 函数可以重用,不必为其他应用程序重写代码 虽然有这么多好处,但

【C++】关键字inline

1. 引入inline关键字的原因 在c/c++中,为了解决一些频繁调用的小函数大量消耗栈空间(栈内存)的问题,特别的引入了inline修饰符,表示为内联函数. 栈空间就是指放置程序的局部数据(也就是函数内数据)的内存空间. 在系统下,栈空间是有限的,假如频繁大量的使用就会造成因栈空间不足而导致程序出错的问题,如,函数的死循环递归调用的最终结果就是导致栈内存空间枯竭. 下面我们来看一个例子: #include <stdio.h> //函数定义为inline即:内联函数 inline char*

c++中static和inline关键字

一.static变量和static函数 static全局变量与普通的全局变量有什么区别?static局部变量和普通局部变量有什么区别?static函数与普通函数有什么区别? 答: 1) 全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量.全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式. 这两者在存储方式上并无不同.这两者的区别在于非静态全局变量的作用域是整个源程序, 当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的. 而静态全局变量

C++ | inline关键字和内联函数

inline关键字 作用:避免频繁调用函数对栈内存重复开辟所带来的消耗. 在 c/c++ 中,为了解决一些频繁调用的小函数大量消耗栈空间(栈内存)的问题,特别的引入了 inline 修饰符,表示为内联函数. 栈空间就是指放置程序的局部数据(也就是函数内数据)的内存空间. 在系统下,栈空间是有限的,假如频繁大量的使用就会造成因栈空间不足而导致程序出错的问题,如,函数的死循环递归调用的最终结果就是导致栈内存空间枯竭. 内联函数 C++内联函数是通常与类一起使用.如果一个函数是内联的,那么在编译时,编

C++中的inline声明

C++中的inline声明 1. inline函数(摘自C++ Primer的第三版) 在函数声明或定义中函数返回类型前加上关键字inline即把函数指定为内联函数. inline int min(int first, int secend) { /****/ };   inline 函数对编译器而言必须是可见的,以便它能够在调用点(调用这个内联函数的位置)内展开该函数. 与非inline函数不同的是,inline函数必须在调用该函数的每个文本文件中定 义.当然,对于同一程序的不同文件,如果in

内联(inline)函数

内联函数避免函数调用的开销将函数指定为内联函数,(通常)就是将它在程序中每个调用点上“内联地”展开.假设我们将shorterStirng定义为内联函数,则调用:cout<<shorterSring(s1,s2)<<endl;在编译时将展开为:cout<<(s1.size() < s2.size() ? s1 : s2)       <<endl;从而消除了把shorterString写成函数的额外执行开销.在函数返回类型前加上关键字inline就可以将

C++经典问答 inline 函数

inline函数的作用是什么? 在某些情况下,inline函数能使受计算量限制的应用程序运行的更快. 从广义上讲,inline函数的背后的思想是在调用函数的地方插入该函数的代码. 关键字"inline"和"inlined"函数之间的联系是什么? 用关键字inline修饰的函数可能不被直接插入,而直接插入的函数也可能不被标明为inline,被直接插入的惟一确定方式是根本不存在的! 关于直接插入有什么特殊的规则吗? 1.任何包含inline函数用法的源文件都必须包含该函

inline函数的使用方法

 inline关键字用来定义一个类的内联函数,引入它的主要原因是用它替代C中表达式形式的宏定义. 表达式形式的宏定义如下: #define ExpressionName(Var1,Var2) ((Var1)+(Var2))*((Var1)-(Var2)) 为什么要取代这种形式呢,且听我道来: 1. 首先谈一下在C中使用这种形式宏定义的原因,C语言是一个效率很高的语言,这种宏定义在形式及使用上像一个函数,但它使用预处理器实现,没有了参数压栈,代码生成等一系列的操作,因此,效率很高,这是它在C中

c++ inline函数

ref:http://www.cnblogs.com/berry/articles/1582702.html (一)inline函数(摘自C++ Primer的第三版) 在函数声明或定义中函数返回类型前加上关键字inline即把min()指定为内联. inline int min(int first, int secend) {/****/}; inline 函数对编译器而言必须是可见的,以便它能够在调用点内展开该函数.与非inline函数不同的是,inline函数必须在调用该函数的每个文本文件