c++内联函数与静态函数
不能是虚函数的成员函数有:静态成员函数,内联成员函数,构造函数。
没有什么函数需要硬性规定为虚函数,一般析构函数会被定义为虚函数
其他就是在继承类中可能需要override的类成员函数应该定义为虚函数 http://www.cnblogs.com/this-543273659/archive/2011/08/17/2143607.html
1.内联函数是个静态行为,而虚函数是个动态行为,他们之间是有矛盾的。
2.我们之所以能看到一些象内联函数的虚函数,是因为某个函数是否是内联函数不是由我们说的算,而是由编译器决定的。我们只能向编译器建议,某个函数可以是内联函数(inline关键字),但是编译器有自己的判断法则。所以可能出现这样的情况:
2.1 我们用inline声明的函数却没有inline
2.2 我们没有用inline声明的函数却是inline
2.3 对于inline函数,编译器仍然将它编译成一个有地址的函数
所以,情况比较复杂,从high-level来看的话很难判断函数是否是inline的,如果从low-level来看的话就比较清晰,非内联函数遵从函数调用机制,在汇编中用call来调用。内联函数则没有这些。
inline函數表示該函數是内聯的,它建議編譯器在調用該函數的地方直接將函數的代碼展開來
插入caller的代碼中.這個只是一種指示至於會不會被内聯編譯器還會根據被聲明為inline
的函數的内部結構如:是否包含循環,複雜的函數調用等等來選擇是否inline。
1.虛函數肯定不會被内聯這一點毋庸置疑,因為虛函數只有到了Runtime才能被識別到底是哪一個被
調用,而内聯是編譯期就會將代碼展開並安插這個明顯不是一囘事。
2.inline有兩种表現方式一種就是以inline在實現文件中(.cpp)指出這被稱爲顯示内聯,另外一種
就如你所說類的聲明和定義放入同一個文件這稱爲隱式内聯,但是還是如前面所說inline只是一個
提示符至於會不會内聯還是由編譯器說了算。
常见的不能声明为虚函数的有:普通函数(非成员函数)、静态成员函数、内联成员函数、构造函数、友元函数。
1、为什么C++不支持普通函数为虚函数? 普通函数(非成员函数)只能overload,不能被override,声明为虚函数也没有什么意思,因此编译器会在编译时绑定函数。2、为什么C++不支持构造函数为虚函数?这个原因很简单,主要是从语义上考虑,所以不支持。因为构造函数本来是为了明确初始化对象成员才产生的,然而virtual function主要是为了在不完全了解细节的情况下也能正确处理对象。另外,虚函数是在不同类型的对象产生不同的动作,现在对象还没有产生,如何使用虚函数来完成你想完成的动作。3、为什么C++不支持静态成员函数为虚函数? 静态成员函数对于每个类来说只有一份代码,所有的对象都共享这一份代码,他不归某个对象所有,所以他也没有动态绑定的必要性。4、为什么C++不支持内联成员函数为虚函数? 其实很简单,内联函数就是为了在代码中直接展开,减少函数调用话费的代价,虚函数是为了在继承后对象能够准确的执行自己的动作,这是不可能统一的。再说,inline函数在编译时被展开,虚函数在运行时才能动态的绑定函数。5、为什么C++不支持友元函数为虚函数?因为C++不支持友元函数的继承,对于没有继承特性的函数没有虚函数的说法。
在C++中,用户可以创建实际上不调用的短函数,他们的代码在每次调用的程序行里得到扩展。这个过程类似于使用类似函数的宏。为使一个函数在程序行进行代码扩展而不被调用,只要在函数前面加上关键字inline即可。
构造函数和析构函数也可以是内联的。
例如,在下面的程序,函数max()在行内扩展而不被调用:
|
1
2
3
4
5
6
7
8
9
10
11
|
#include <iostream>using namespace std;inline int max(int a, int b){ return a>b?a:b;}int main(){ cout<<max(10,20); cout<<" "<<max(99,88);} |
上面的程序等价于下面的程序:
|
1
2
3
4
5
6
7
|
#include <iostream>using namespace std;int main(){ cout<<(10>20?10:20); cout<<" "<<(99>88>99:88);} |
内联函数是C++的一个重要补充的原因是,他们能使程序员写出非常有效的代码。因为类一般要求几个经常被执行的接口函数,因此,这些函数的效率在C++中是非常重要的。我们知道,每次调用函数时,变元要进栈,各种寄存器内容要保存;函数返回时,又要恢复他们的内容。问题是这些指令要占用时间。但是,如果函数在行内扩展,上述那些操作就不存在了。当然,虽然函数行内扩展能产生较快的速度,但由于重复编码会产生较长的代码,因此最好只内联那些能明显影响程序性能的函数。
inline对编译器是一种请求,而不是命令。编译器可以选择忽略它。还有,一些编译器不能内联所有类型的函数。例如,通常编译器不能内联递归函数。必须查阅自己的编译器用户手册以了解对内联的限制。如果一个函数不能被内联,它就被当作一个正常的函数调用。
inline关键字不是C++的 C子集 的一部分,因此,C89没有定义它,然而,C99中增加了它。
内联函数可以是类的成员。
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
class myclass{ int a,b;public: void init(int i,int j); void shou();};inline void myclass::init(int i,int j){ a = i; b = j;}inline void myclass::show(){ cout<<a<<" "<<b<<"\n";} |
在类声明内定义内联函数
在类声明内(大括号之内)定义内联函数是可能的。如果一个函数是在类声明内定义的,它将自动的转换成内联函数(如果可能的话)。没有必要(但不是错误)在函数声明的前面再加上关键字inline。
|
1
2
3
4
5
6
7
|
class myclass{ int a,b;public: //automatic inline void init(int i, int j){a=i;b=j;} void show(){cout<<a<<" "<<b<<"\n";}} |
在C++中,用户可以创建实际上不调用的短函数,他们的代码在每次调用的程序行里得到扩展。这个过程类似于使用类似函数的宏。为使一个函数在程序行进行代码扩展而不被调用,只要在函数前面加上关键字inline即可。
c++内联函数与静态函数的更多相关文章
- 拷贝构造函数,深拷贝,大约delete和default相关业务,explicit,给定初始类,构造函数和析构函数,成员函数和内联函数,关于记忆储存,默认参数,静态功能和正常功能,const功能,朋友
1.拷贝构造 //拷贝构造的规则,有两种方式实现初始化. //1.一个是通过在后面:a(x),b(y)的方式实现初始化. //2.另外一种初始化的方式是直接在构造方法里面实现初始化. 案比例如以 ...
- C++解析四-友员函数、内联函数、静态成员
友元函数 类的友元函数是定义在类外部,但有权访问类的所有私有(private)成员和保护(protected)成员.尽管友元函数的原型有在类的定义中出现过,但是友元函数并不是成员函数.友元可以是一个函 ...
- 转-C++之虚函数不能定义成内联函数的原因
转自:https://blog.csdn.net/flydreamforever/article/details/61429140 在C++中,inline关键字和virtual关键字分别用来定义c+ ...
- c++面向对象 之 内联函数 this 静态成员
1,内联函数 如果一个函数是内联的,那么在编译时,编译器会把该函数的代码副本放置在每个调用该函数的地方.用inline指定,内联函数通常短小精悍没有while和for循环,能够帮助提升程序执行的速度 ...
- C++内联函数
在C语言中,我们使用宏定义函数这种借助编译器的优化技术来减少程序的执行时间,那么在C++中有没有相同的技术或者更好的实现方法呢?答案是有的,那就是内联函数.内联函数作为编译器优化手段的一种技术,在降低 ...
- CG_INLINE,inline 内联函数
内联函数,即在编译的时候将函数体替换函数调用,从而不需要将parameter,return address进行push/pop stack的操作,从而加速app的运行,然而,会增加二进制文件的大小. ...
- 不可或缺 Windows Native (16) - C++: 函数重载, 缺省参数, 内联函数, 函数模板
[源码下载] 不可或缺 Windows Native (16) - C++: 函数重载, 缺省参数, 内联函数, 函数模板 作者:webabcd 介绍不可或缺 Windows Native 之 C++ ...
- C++ 内联函数笔记
要使用内联函数,必须采取下述措施之一: +在函数声明前加上关键字inline: +在函数定义前加上关键字inline. 通常的做法是省略原型,将整个定义(即函数头和所有函数代码)放在本应提供原型的地方 ...
- 我的c++学习(6)默认参数和内联函数
默认参数 一般情况下,函数调用时实参个数应与形参相同,但为了更方便地使用函数,C++也允许定义具有默认参数的函数,这种函数调用时实参个数可以与形参不相同.“默认参数”指在定义或声明函数时为形参指定默认 ...
随机推荐
- lightoj 1018 (状态压缩DP)
设dp[s]表示状态s下所需要的线段的个数,s的二进制中第x位为1就表示该状态下第x个点没被线段覆盖.需要预处理出来在任意两点之间连线所覆盖点的状态O(n^3),然后记忆化搜索即可. #include ...
- NOR型flash与NAND型flash的区别
1) 闪存芯片读写的基本单位不同 应用程序对NOR芯片操作以“字”为基本单位.为了方便对大容量NOR闪存的管理,通常将NOR闪存分成大小为128KB或者64KB的逻辑块,有时候块内还分成扇区.读写时 ...
- Android编译过程详解(一)
Android编译过程详解(一) 注:本文转载自Android编译过程详解(一):http://www.cnblogs.com/mr-raptor/archive/2012/06/07/2540359 ...
- 为zend studio增加Extjs代码提示功能
http://blog.163.com/liuhaijun_83/blog/static/61175622201223114216786/ 需要将其中的http://www.spket.com/upd ...
- Android实例-调用GOOGLE的TTS实现文字转语音(XE7+小米2)(无图)
注意:在手机上必须选安装文字转语音引擎“google Text To Speech”地址:http://www.shouji56.com/soft/GoogleWenZiZhuanYuYinYinQi ...
- jsDoc注释的规范
注释以/** 开始 */结束 JSDoc 命令属性 命令名 描述 @param @argument 指定参数名和说明来描述一个函数参数. @return @returns 描述函数的返回值. ...
- Unity3D之AssetBundle学习:Android上运行笔记
路径统一 在Android上加载StreamingAssets文件夹下的AssetBundle文件,首先需要对加载地址进行处理,注意PC.Android和IOS的地址不一致需要针对不同的平台不同的处理 ...
- paip.云计算以及分布式计算的区别
paip.云计算以及分布式计算的区别 云计算的特点 1 网格计算 2 分布式计算 2 云计算以及网格计算以及分布式计算的区别 2 作者Attilax 艾龙, EMAIL:1466519819@qq ...
- matlab inpolygon 判断点在多边形内
如何判断一个点在多边形内部? xv= [0 3 3 0 0]; %x坐标 yv= [0 0 3 3 0];%y坐标 x=1.5; y=1.5; in=inpolygon(x,y,xv,yv) plot ...
- Php AES加密、解密与Java互操作的问题
国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html 内部邀请码:C8E245J (不写邀请码,没有现金送) 国 ...