c++和c语言的inline关键字对比

其实我一直比较喜欢C语言,对C++的了解少之又少,但是最近由于需要翻看起C++的书籍来。在C++沉思录当中,看到了这样一句话:“我还指出,由于这些成员函数定义在Trace类自身的定义内,C++会内联扩展它们,所以就使得即使在不进行跟踪的情况下,在程序中保留Trace对象也不必付出许多代价。——Koenig,《C++沉思录中文版》,page2”。K先生所举例的代码如下所示:

 1 class
 2 Trace{
 3 public :
 4            Trace(){noisy = 0;}
 5            void print(char *s){if(noisy) printf("%s,"s);}
 6            void on(){noisy = 1;}
 7            void off(){noisy = 0;}
 8
 9 private:
10            noisy = 1;
11 }

其实这段代码风格并不是所提倡的(函数的声明和定义其实应该分隔开的),当然K先生这里的目的是举个例子说明问题。

但是这里确实引起了我的疑惑,为什么K先生说“即使在不跟踪的情况下,在程序中保留Trace对象也不必付出许多代价”?按理说,这种把函数定义直接写在类内部的方式直接导致了函数的内联,而内联确实膨胀程序,因此我产生了疑惑,这里先埋下伏笔,在知识梳理完毕后尝试解惑故。



下面的知识引用自CSDN博客,http://blog.csdn.net/lidh04/article/details/3795802和http://blog.csdn.net/zhangchao3322218/article/details/8099747。

首先在C语言中也是存在inline的,这里的说明是针对gcc 编译器的。在gcc 中,有三种方式的内联,分别为static inline,inline,extern inline,下面分开介绍:

1.inline。定义的说法:这是一个针对函数定义的关键字(注意并非针对声明),用于对编译器的建议,当然编译器有理由拒绝,其作用为不专门为其在调用处产生汇编代码,只是像宏那样进行展开。

注意,以下情况不在上述讨论的范围内:

一、回调

二、递归

例外情况的原因请读者自行思考。而且,被这样生命的函数可以在文件外被调用,像这样

extern func();

但是需要注意的是,不可以出现这种情况:

extern inline function();//这是不对的

这是我们下面讨论的extern inline,使用情况很狭窄,请注意。

2.static inline 。可以理解为static和inline这两种属性的叠加。故而,相对于inline来讲,static限制了这种函数只能在被定义的文件中使用,不可以被extern。

3.extern inline。这个不能想当然的理解为extern 和 inline 属性的叠加。实际上,gcc的extern inline 函数只能被内联,并不会产生出独立的汇编代码,即使出现了上面提到的两种意外;而且,extern inline 允许在同一个文件中出现重名函数。

但是我们一般没有理由使用这样一种东西,其存在的意义我现在还没有搞明白。

下面来看一下在C++当中的inline。

其实这两种语言的的inline很相似的,C++中比C中多的那一部分应该使我们在开篇提到的Class的内部会自动将已经定义好的函数内联,但是这个并不是值得提倡的。在编译的时候,inline函数省去了函数调用的开销(esp,ebp,寄存器数据改变,局部性改变,上下文切换等等),因此规模较小的inline函数会增加性能。

那么我们回到刚开始的疑惑,尝试着解答。

回顾一下,我的疑惑是K先生的“在程序中保留Trace对象也不必付出许多代价”,产生疑惑的原因是我对于内联的理解:在调用处进行函数的展开,导致程序的膨胀。

但是由于这里被内联的函数很小,根本和膨胀谈不上关系,在我们不回收Trace对象的时候,也不会产生太大的浪费,也就是K先生所言“代价”。



c++和c语言的inline关键字对比

时间: 2024-10-08 10:16:47

c++和c语言的inline关键字对比的相关文章

C语言的inline关键字

一直以来我就认为inline关键字是C++中的.今天我看到一篇讲关于C语言的inline关键字的.呵呵... 原来是我弄错了.看来以后定义一些宏命令完全可以用这样的一些inline函数来代替了.以下是我从网上搜集来的知识点(来 源:http://superding.spaces.live.com/Blog/cns!89E842A8485366C7!1137.entry) 本文介绍了GCC和C99标准中inline使用上的不同之处.inline属性在使用的时候,要注意以下两点: inline关键字

c++中static和inline关键字

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

inline关键字的作用

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

C++ inline关键字

1. C的延续 C++是一门承上启下的编程语言,没有写class他就是C语言,这也导致了很多编译器既支持C++也支持C.inline关键字其实更多地出现在C语言当中,因为很多短小的工作函数可以达到快速执行的效果. 将函数声明为inline实际上表示编译器会将inline函数粘贴到调用点处,省去了原本函数查找.调用的时间 2. inline使用原则 要定义一个函数为inline函数,需要满足以下原则: 1)不可包含复杂的结构控制语句,包括循环控制和复杂的条件控制,例如while, switch.

GCC和C99标准中inline使用上的不同之处。inline属性在使用的时候,要注意以下两点:inline关键字在G

本文介绍了GCC和C99标准中inline使用上的不同之处.inline属性在使用的时候,要注意以下两点:inline关键字在GCC参考文档中仅有对其使用在函数定义(Definition)上的描述,而没有提到其是否能用于函数声明(Declare). 从 inline的作用来看,其放置于函数声明中应当也是毫无作用的:inline只会影响函数在translation unit(可以简单理解为C源码文件)内的编译行为,只要超出了这个范围inline属性就没有任何作用了.所以inline关键字不应该出现

【转载】理解C语言中的关键字extern

原文:理解C语言中的关键字extern 最近写了一段C程序,编译时出现变量重复定义的错误,自己查看没发现错误.使用Google发现,自己对extern理解不透彻,我搜到了这篇文章,写得不错.我拙劣的翻译了一下.(原文:http://www.geeksforgeeks.org/understanding-extern-keyword-in-c/)   我确定这篇文章对c语言的初学者会有很大的帮助,因为这将使他们更好更熟练的使用c语言.所以就让我先来说说extern关键字在变量和函数上的应用.最基本

C语言32个关键字总结

C语言32个关键字  第一类:数据类型关键字 A基本数据类型(5个) void 声明函数无返回值或无参数,声明无类型指针,显式丢弃运算结果. char 字符型类型数据,属于整型数据的一种.int 整型数据,通常为编译器指定的机器字长.float 单精度浮点型数据,属于浮点数据的一种,小数点后保存6位.double 双精度浮点型数据,属于浮点数据的一种,比float保存的精度高,小数点后保存15/16位. B类型修饰关键字(4个) short 修饰int,短整型数据,可省略被修饰的int. lon

转: inline关键字使用

1.inline用在函数声明时,还是函数定义时?还是两边都加? 首先,内联函数声明和定义最好在同一个文件中,其它的情况没有实用上的意义. 只要在同一个文件中,声明和定义至少其一加“inline”修饰即可. 2.inline的函数可不可以同时是虚函数? 可以. 因为inline只是给编译器的一种建议,编译器并不保证一定进行内联展开,也并不保证一定不进行内联展开.更详细地讲,假如有10个地方调用了这个函数,并不保证10处都会内联展开或都不会内联展开,完全可能实际上只展开了5处.另外5处没有展开. 因

C语言的那些关键字

C语言有一堆关键字,一共n个,就在下面: 1.类型关键字 系统内置类型:long short int char float double void long:32位整数,默认为有符号,下同 short:16位整数 int:根据机器而定是32位还是16位整数,现在的一般都是32(常用) char:8位字符(常用) float:32位小数(单精度) double:64位小数(双精度)(常用) void:无(变量只能用于void*,函数返回类型可以用void)(常用) 自定义类型:struct uni