VC++ inline内联函数的作用解决方案
VC++ inline内联函数的作用解决方案
__attribute__((always_inline))
attribute((always_inline))的意思是强制内联,所有加了attribute((always_inline))的函数再被调用时不会被编译成函数调用而是直接扩展到调用函数体内,比如我定义了函数
attribute((always_inline)) void a()和
void b()
{
a();
}
b调用a函数的汇编代码不会是跳转到a执行,而是a函数的代码直接在b内成为b的一部分。
define inline __attribute((always_inline))的意思就是用
inline 代替__attribute((always_inline))
内声明a的时候可以直接写成inline void a()这样比较方便因为__attribute((always_inline))
字多=,=
内联函数就是把函数体的定义写在函数声明中,节省编译的空间和速度。
使用内联函数后是不是就可以不用声明函数了?
------解决方案--------------------
不一样 你可以把内联看成是一种特殊形式的宏 如一段代码很小但是被频繁调用就可以考虑把他声明为inline(或者__foeceinline)的 它主要从运行速度来考虑 不一定会减小程序大小 甚至可能更大
写成inline不一定真的inline 编译器会看情况选择是否真的inline 当调用这个函数相当于一个宏一样的时候 由于省掉了函数调用开销 运行速度就会变得更快
------解决方案--------------------
内联是以代码膨胀为代价来换取速度的~
------解决方案--------------------
介绍内联函数之前,有必要介绍一下预处理宏。内联函数的功能和预处理宏的功能相似。相信大家都用过预处理宏,我们会经常定义一些宏,如
#define TABLE_COMP(x) ((x)>0?(x):0)
就定义了一个宏。
为什么要使用宏呢?因为函数的调用必须要将程序执行的顺序转移到函数所存放在内存中的某个地址,将函数的程序内容执行完后,再返回到转去执行该函数前的地方。这种转移操作要求在转去执行前要保存现场并记忆执行的地址,转回后要恢复现场,并按原来保存地址继续执行。因此,函数调用要有一定的时间和空间方面的开销,于是将影响其效率。而宏只是在预处理的地方把代码展开,不需要额外的空间和时间方面的开销,所以调用一个宏比调用一个函数更有效率。
但是宏也有很多的不尽人意的地方。
1、.宏不能访问对象的私有成员。
2、.宏的定义很容易产生二意性。
我们举个例子:
#define TABLE_MULTI(x) (x*x)
我们用一个数字去调用它,TABLE_MULTI(10),这样看上去没有什么错误,结果返回100,是正确的,但是如果我们用TABLE_MULTI(10+10)去调用的话,我们期望的结果是400,而宏的调用结果是(10+10*10+10),结果是120,这显然不是我们要得到的结果。避免这些错误的方法,一是给宏的参数都加上括号。
#define TABLE_MULTI(x) ((x)*(x))
这样可以确保不会出错,但是,即使使用了这种定义,这个宏依然有可能出错,例如使用TABLE_MULTI(a++)调用它,他们本意是希望得到(a+1)*(a+1)的结果,而实际上呢?我们可以看看宏的展开结果: (a++)*(a++),如果a的值是4,我们得到的结果是5*6=30。而我们期望的结果是5*5=25,这又出现了问题。事实上,在一些C的库函数中也有这些问题。例如: Toupper(*pChar++)就会对pChar执行两次++操作,因为Toupper实际上也是一个宏。
我们可以看到宏有一些难以避免的问题,怎么解决呢?
下面就是用我要介绍的内联函数来解决这些问题,我们可以使用内联函数来取代宏的定义。而且事实上我们可以用内联函数完全取代预处理宏。
内联函数和宏的区别在于,宏是由预处理器对宏进行替代,而内联函数是通过编译器控制来实现的。而且内联函数是真正的函数,只是在需要用到的时候,内联函数像宏一样的展开,所以取消了函数的参数压栈,减少了调用的开销。你可以象调用函数一样来调用内联函数,而不必担心会产生于处理宏的一些问题。
我们可以用Inline来定义内联函数,不过,任何在类的说明部分定义的函数都会被自动的认为是内联函数。
下面我们来介绍一下内联函数的用法。
内联函数必须是和函数体申明在一起,才有效。像这样的申明Inline Tablefunction(int I)是没有效果的,编译器只是把函数作为普通的函数申明,我们必须定义函数体。
Inline tablefunction(int I) {return I*I};
这样我们才算定义了一个内联函数。我们可以把它作为一般的函数一样调用。但是执行速度确比一般函数的执行速度要快。
我们也可以将定义在类的外部的函数定义为内联函数,比如:
Class TableClass{
Private:
Int I,j;
Public:
Int add() { return I+j;};
Inline int dec() { return I-j;}
Int GetNum();
}
inline int tableclass::GetNum(){
return I;
}
上面申明的三个函数都是内联函数。在C++中,在类的内部定义了函数体的函数,被默认为是内联函数。而不管你是否有inline关键字。
内联函数在C++类中,应用最广的,应该是用来定义存取函数。我们定义的类中一般会把数据成员定义成私有的或者保护的,这样,外界就不能直接读写我们类成员的数据了。对于私有或者保护成员的读写就必须使用成员接口函数来进行。如果我们把这些读写成员函数定义成内联函数的话,将会获得比较好的效率。
Class sample{
Private:
Int nTest;
Public:
Int readtest(){ return nTest;}
Void settest(int I) {nTest=I;}
}
当然,内联函数也有一定的局限性。就是函数中的执行代码不能太多了,如果,内联函数的函数体过大,一般的编译器会放弃内联方式,而采用普通的方式调用函数。这样,内联函数就和普通函数执行效率一样了。
VC++ inline内联函数的作用解决方案相关推荐
- C语言中内联函数的作用 inline
C语言中内联函数的作用 inline C语言中内联函数到底有什么作用? 试想一下,每当我们在假设就在主函数中调用另外一个函数的时候,那么这个函数就要入栈或者出栈,比如说下面的一个例子: 点击(此处)折 ...
- c语言inline不起作用,C语言inline内联函数学习小结
//inline(内联)函数:将普通的函数定义为inline函数,可以避免普通函数入栈出栈的开销,它是将函数内的代码直接粘贴到调用处.除此之外,它和普通函数无异. //要成为inline函数必须具备以 ...
- inline内联函数
inline 内联函数和普通函数的区别: 1.inline内联函数:在编译过程中,就没有函数的调用开销了,在函数的调用点直接把函数的代码进行展开处理 2.inline 函数不再生成相应的函数符号 in ...
- C++ inline内联函数
C++ inline内联函数 简介 声明内联函数 定义内联函数 总结 简介 函数是一个可以重复使用的代码块,CPU 会一条一条地挨着执行其中的代码.CPU 在执行主调函数代码时如果遇到了被调函数,主调 ...
- inline内联函数 static静态函数 普通函数区别
面试时候一般只会问你区别,所有本文只说区别. 内联函数和普通函数的区别: 内联函数和普通函数最大的区别在于内部的实现方面,当普通函数在被调用时,系统首先跳跃到该函数的入口地址,执行函数体,执行完成后, ...
- inline内联函数(声明前加inline还是定义前加inline)
原文地址:http://blog.csdn.net/nanhaizhixin/article/details/7564084 (一)inline函数(摘自C++ Primer的第三版) 在函数声明或定 ...
- 对普通函数、宏函数、内联函数的作用机制的探索
这次我们来分析的是C/C++程序员经常遇到的问题,如何在普通函数.宏函数.内联函数之间做取舍,其实它们三者之间并没有什么绝对的你好我差的说法,只要掌握了三者的作用机制的话,结合实际情况一般都能做出正确 ...
- C语言的内联函数的作用
关内联函数键字inline void myprintf(int a) { priintf("%d",a); } int main() { for(i=0;i<100;i++) ...
- 使用 inline 内联函数对抗逆向分析
在 ARM 汇编里函数调用是使用 bl 指令跳转到函数地址,攻击者逆向分析很容易找到调用过程,分析参数和返回值. 可以将一些敏感的函数,比如将加密函数写成 inline 内联,无论代码里调用了多少次函 ...
最新文章
- 【转】最佳 WordPress 缓存插件:WP Super Cache
- 【BERT】BERT模型压缩技术概览
- 已知三角形三点坐标求角度_2019高考数学:解三角形——正弦定理和余弦定理的解题技巧和模型...
- why CRMFSH01 failed to return any value for my case
- cls certificate.php,php加密解密处理类
- jquery解决和其他库冲突的问题
- align latex 使用_latex中使用listings时如何使matlab代码块居左而非居中,最好与上面的文本对齐...
- jQuery mobile 开发问题记录
- MyEclipse—如何在MyEclipse中创建servlet3.0
- Adobe产品序列号
- xshell连不上阿里云服务器Connection closed by foreign host.解决办法
- php 高斯分布,多元高斯分布完全解析
- Solidworks与Matlab联合仿真SimMechnics下载及安装
- Django第三方登录
- 如何批量预览并一键下载pexels视频和图片
- syntax error, unexpected ‘array‘ (T_ARRAY)
- C++ Primer 第5版--练习9.14
- 实现pdf文件打印预览
- ╭*★*╯浮华一场烟雨梦,叶落无痕情无踪╭*★*╯
- Swagger2 3.0的使用
热门文章
- 462计算机连接错误,与Internet Explorer的运行时错误462
- mysql 生产实践_mysql-主从复制
- 什么是机器人的五点校正法_样品定量检测怎样选择内标法和外标法!
- 等待队列——休眠与唤醒
- java模拟银行存取_JAVA基础案例 模拟银行存取款业务
- 2003服务器系统屏蔽广告,电脑总是乱弹广告弹窗?教你彻底关闭
- java线性表_java实现线性表
- linux透明加密系统,基于Linux的透明加密系统的设计与实现
- linux命令行下命令参数前的一横(-)和两横(--)的区别
- js向php传递中文参数,JS传递参数时对中文进行编码和解码