Inline 函数

原创 2007年09月26日 14:10:00

                                  Inline 函数

1.   规则一、一个函数可以自已调用自已,称为递归调用(后面讲到),含有递归调用的函数不能设置为inline

 

2.   规则二、使用了复杂流程控制语句:循环语句和switch语句,无法设置为inline

 

3.   规则三、由于inline增加体积的特性,所以建议inline函数内的代码应很短小。最好不超过5行。

 

4.   规则四、inline仅做为一种“请求”,特定的情况下,编译器将不理会inline关键字,而强制让函数成为普通函数。出现这种情况,编译器会给出警告消息。

5.   规则五、在你调用一个内联函数之前,这个函数一定要在之前有声明或已定义为inline,如果在前面声明为普通函数,而在调用代码后面才定义为一个inline函数,程序可以通过编译,但该函数没有实现inline

 

void test()

 

// 中间调用test(),则没有实现inline

 

inline void test()

{

   //….

}

 

这里面顺便提一下,如果一个普通函数定义在.h文件里面,这个头文件被多个.cpp文件include的时候,会出现重复定义的错误,因为编译后每个.cppobj文件里面都有该函数的实现,所以一链接就出错,这和普通全局变量一样。解决的办法

a.   如果是简单的函数就可以让它变成内联函数。

b.   也可以加static,让其成为静态函数

c.   把其定义移到.cpp文件中去。

 

6.    规则六、为了调试方便,在程序处于调试阶段时,所有内联函数都不被实现。非类成员函数时

 

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

如下风格的函数Foo 不能成为内联函数:

inline void Foo(int x, int y); // inline 仅与函数声明放在一起

void Foo(int x, int y)

{

}

而如下风格的函数Foo 则成为内联函数:

void Foo(int x, int y);

inline void Foo(int x, int y) // inline 与函数定义体放在一起

{

}

注意:把一个函数的定义放到一个头文件里面是一个规则性的东西。除非函数只是在一个单独的cpp文件中调用到了。特别的,如果你把内联函数放在一个cpp文件里面,而你从其他的cpp文件里面调用它,你会在连接器得到一个"unresolved external"错误。

inline functions 一般必须在头文件内,因为大多数构建环境在编译期间进行 inlining(内联化)。为了用被调用函数的函数本体替换一个函数调用,编译器必须知道函数看起来像什么。(有一些构建环境可以在连接期间 inline,还有少数几个——比如,基于 .NET Common Language Infrastructure (CLI) 的托管环境——居然能在运行时 inline。然而,这些环境都是例外,并非规定。inlining(内联化)在大多数 C++ 程序中是一个 compile-time activity(编译期行为)。)

templates 一般在头文件内,因为编译器需要知道一个 template 看起来像什么以便需要时对它进行实例化。(同样,也不是全部如此。一些构建环境可以在连接期间进行 template instantiation(模板实例化)。然而,compile-time instantiation(编译期实例化)更为普遍。)

所以说,inline 是一种“用于实现的关键字”,而不是一种“用于声明的关键字”。一般地,用户可以阅读函数的声明,但是看不到函数的定义。尽管在大多数教科书中内联函数的声明、定义体前面都加了inline 关键字,但我认为inline 不应该出现在函数的声明中。这个细节虽然不会影响函数的功能,但是体现了高质量C++/C 程序设计风格的一个基本原则:声明与定义不可混为一谈,用户没有必要、也不应该知道函数是否需要内联。

 

8.   定义在类声明之中的成员函数将自动地成为内联函数,例如

class A

{

public:

void Foo(int x, int y) {  } // 自动地成为内联函数

}

将成员函数的定义体放在类声明之中虽然能带来书写上的方便,但不是一种良好的编程风格,上例应该改成:

// 头文件

class A

{

public:

void Foo(int x, int y) // 不需要加上inline关键字

}

// 定义文件 .cpp

inline void A::Foo(int x, int y)

{

}

 

C++inline函数简介

1.inline函数简介 inline函数是由inline关键字来定义,引入inline函数的主要原因是用它替代C中复杂易错不易维护的宏函数。 2.编译器对inline函数的处理办法 inl...
  • K346K346
  • K346K346
  • 2016年07月31日 22:39
  • 3940

类成员声明与定义前加inline的区别(C++ inline 函数)

转载自:http://www.cnblogs.com/berry/articles/1582702.html 参考:http://msdn.microsoft.com/zh-cn/library/wi...
  • fengzizhuang
  • fengzizhuang
  • 2014年03月18日 20:34
  • 2545

inline函数的声明与定义

(一)inline函数(摘自C++ Primer的第三版) 在函数声明或定义中函数返回类型前加上关键字inline即把min()指定为内联。       inline int min(int fi...
  • CodeHeng
  • CodeHeng
  • 2015年04月04日 10:26
  • 2292

inline函数说明(转载)

  • 2008年11月18日 16:18
  • 9KB
  • 下载

关于头文件中的 static inline函数

关于头文件中的 static inline函数     头文件中常见static inline函数,于是思考有可能遇到的问题,如头文件经常会被包含会不会产生很多副本?网上说法不一。于是自己验证。经过...
  • huanghui167
  • huanghui167
  • 2014年11月21日 11:48
  • 17233

Kotlin语法(十九)-内联函数(Inline Functions)

参考原文: http://kotlinlang.org/docs/reference/inline-functions.html            使用高阶函数造成一些运行时问题:每一个函...
  • tangxl2008008
  • tangxl2008008
  • 2016年12月15日 09:49
  • 4967

C++中inline与函数调用

转自:http://blog.csdn.net/kekuixiong/article/details/6652254 转自:http://www.cnblogs.com/yitianke/p/331...
  • Lee_Shuai
  • Lee_Shuai
  • 2016年11月19日 11:40
  • 615

C++内联函数(Inline)介绍

C++内联函数(Inline)介绍2001-11-12 09:34作者:杜瑾出处:yesky责任编辑:方舟  介绍内联函数之前,有必要介绍一下预处理宏。内联函数的功能和预处理宏的功能相似。相信大家都用...
  • shuiyingzi5
  • shuiyingzi5
  • 2011年02月15日 23:46
  • 302

浅析c++中的内联函数(关键字inline)

常规函数:执行到函数调用指令时,程序将在函数调用后立即存储该指令的内存地址,并将函数参数复制到堆栈,跳到标记函数起点的内存单元,执行函数代码,然后跳回到地址被保存的指令处。来回的跳跃,需要一定的开销。...
  • wangshubo1989
  • wangshubo1989
  • 2015年10月17日 01:18
  • 3999

iOS安全–使用static inline方式编译函数,防止静态分析

我们知道一般的函数调用都会通过call的方式来调用,这样让攻击很容易对一个函数做手脚,如果是以inline的方式编译的会,会把该函数的code拷贝到每次调用该函数的地方。而static会让生成的二进制...
  • ssyyjj88
  • ssyyjj88
  • 2016年04月17日 16:59
  • 248
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Inline 函数
举报原因:
原因补充:

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