C++内联函数

一、内联函数

1、C++中的const常量可以替代宏常数定义,如:

const int A = 3;   #define A 3

C++中是否有解决方案替代宏代码片段呢?(替代宏代码片段就可以避免宏的副作用!)

2、C++中推荐使用内联函数替代宏代码片段

C++中使用inline关键字声明内联函数

内联函数声明时inline关键字必须和函数定义结合在一起,否则编译器会直接忽略内联请求。

#include <iostream>using namespacestd;#define MIN(a,b) ((a) < (b) ? (a) : (b))inline int myfunc(inta, int b)
{return a < b ? a : b;
}int main(void)
{int a = 1;int b = 3;//int c = myfunc(++a, b);int c = MIN(++a, b);printf("a = %d\n", a);printf("b = %d\n", b);printf("c = %d\n", c);return 0;
}

说明1:必须inline intmyfunc(int a,int b)和实现的地方,写在一块。

说明2:C++编译器可以将一个函数进行内联编译;被C++编译器内联编译的函数叫做内联函数;内联函数在最终生成的代码中是没有定义的;C++编译器直接将函数体插入函数调用的地方;内联函数没有普通函数调用时的额外开销(压栈,跳转,返回)。

说明3:C++编译器不一定准许函数的内联请求

说明4:内联函数是一种特殊的函数,具有普通函数的特征(参数检查,返回类型等);内联函数是对编译器的一种请求,因此编译器可能拒绝这种请求;内联函数由编译器处理,直接将编译后的函数体插入调用的地方;宏代码片段由预处理器处理,进行简单的文本替换,没有任何编译过程。

说明5:现代C++编译器能够进行编译优化,因此一些函数即使没有inline声明,也可能被编译器内联编译;另外,一些现代C++编译器提供了扩展语法,能够对函数进行强制内联,如:g++中的__attribute__((always_inline))属性。

说明6:

C++中内联编译的限制:

不能存在任何形式的循环语句;不能存在过多的条件判断语句;函数体不能过于庞大;不能对函数进行取址操作;函数内联声明必须在调用语句之前。

结论:
(1)内联函数在编译时直接将函数体插入函数调用的地方

(2)inline只是一种请求,编译器不一定允许这种请求

(3)内联函数省去了普通函数调用时压栈,跳转和返回的开销

二、默认参数

1、C++中可以在函数声明时为参数提供一个默认值,     当函数调用时没有指定这个参数的值,编译器会自动用默认值代替。

2、只有参数列表后面部分的参数才可以提供默认参数值,一旦在一个函数调用中开始使用默认参数值,那么这个参数后的所有参数都必须使用默认参数值。

三、函数占位参数

占位参数只有参数类型声明,而没有参数名声明;一般情况下,在函数体内部无法使用占位参数。

四、函数重载

用同一个函数名定义不同的函数;当函数名和不同的参数搭配时函数的含义不同。

int func(int x)
{return x;
}int func(int a, int b)
{return a + b;
}int func(const char *s)
{return strlen(s);
}int main(intargc, char *argv[])
{int c = 0;c = func(1);printf("c = %d\n", c);c = func(1, 2);printf("c = %d\n", c);c = func("12345");printf("c = %d\n", c);return 0;
}

函数重载至少满足下面的一个条件:

参数个数不同

参数类型不同

参数顺序不同

编译器调用重载函数的准则

将所有同名函数作为候选者

尝试寻找可行的候选函数

精确匹配实参

通过默认参数能够匹配实参

通过默认类型转换匹配实参

匹配失败

最终寻找到的可行候选函数不唯一,则出现二义性,编译失败。

无法匹配所有候选者,函数未定义,编译失败。

函数重载的注意事项

重载函数在本质上是相互独立的不同函数(静态链编)

重载函数的函数类型是不同的

函数返回值不能作为函数重载的依据

函数重载是由函数名和参数列表决定的。

函数重载与函数指针

当使用重载函数名对函数指针进行赋值时

根据重载规则挑选与函数指针参数列表一致的候选者

严格匹配候选者的函数类型与函数指针的函数类型

C++ —— C++内联函数相关推荐

  1. 内联函数inline

    结论在文章末尾处! 在C++中,为了解决一些频繁调用的小函数大量消耗栈空间(栈内存)的问题,特别的引入了inline修饰符,表示为内联函数. 内联函数的处理方式是在函数的调用点直接代码展开.在计算机系 ...

  2. C语言的内联函数的作用

    关内联函数键字inline void myprintf(int a) { priintf("%d",a); } int main() { for(i=0;i<100;i++) ...

  3. Matlab编程与数据类型 -- 内联函数

    本微信图文详细介绍了Matlab中的内联函数.

  4. C++中虚函数可以是内联函数吗?

    1.需要注意的几点: 虚函数可以是内联函数,内联是可以修饰虚函数的,但是当虚函数表现多态性的时候不能内联. 内联是在编译器建议编译器内联,而虚函数的多态性在运行期,编译器无法知道运行期调用哪个代码,因 ...

  5. C++中的内联函数inline

    1.Cpp中的内联函数 内联函数是通常与类一起使用.如果一个函数是内联的,那么在编译时,编译器会把该函数的代码副本放置在每个调用该函数的地方.对内联函数进行任何修改,都需要重新编译函数的所有客户端,因 ...

  6. c语言函数参数类型检查,内联函数在编译时是否做参数类型检查?

    先说宏和函数的区别: 1. 宏做的是简单的字符串替换(注意是字符串的替换,不是其他类型参数的替换),而函数的参数的传递,参数是有数据类型的,可以是各种各样的类型. 2. 宏的参数替换是不经计算而直接处 ...

  7. c++学习笔记内联函数,函数重载,默认参数

    c++学习笔记内联函数,函数重载,默认参数 1 inline内联函数 C++中的const常量可以替代宏常数定义,如: const int A = 3;  #define A 3 C++中是否有解决 ...

  8. C6000系列DSP的内联函数

    在c中,为了解决一些频繁调用的小函数大量消耗栈空间或是叫栈内存的问题,特别的引入了inline修饰符,表示为内联函数数.栈空间就是指放置程序的局部数据也就是函数内数据的内存空间,在系统下,栈空间是有限 ...

  9. DSP编程技巧---C/C++与汇编语言的交互之-使用编译器的内联函数

    在C/C++与汇编语言混合编程的情况下,一般我们都会选择C/C++来实现所期待的功能.在我们用C/C++来实现某些位操作.数学运算等功能后,编译器会尽可能地把它们编译为一些已经高度优化的汇编函数(内联 ...

  10. C++对象模型9——临时对象的生命周期、模板及实例化分析、内联函数

    一.临时对象的生命周期 T c=a+b 假设T是一个类型,那么上述代码执行时,首先会产生一个临时对象用来存放a+b的结果(拷贝初始化临时对象),然后用该临时对象拷贝初始化c,最后临时对象被释放.如果开 ...

最新文章

  1. 如何从一个表中选择另一个表中不存在的所有记录?
  2. nagios全攻略(一)----准备阶段
  3. 深入理解javascript原型和闭包(12)——简介【作用域】
  4. Re-installation failed due to different application signatures
  5. SAP Spartacus里的concurrently依赖
  6. Fuel 9.0安装Openstack网络验证失败解决
  7. JProfiler分析内存泄漏
  8. 白话关于API与SDK的区别
  9. 数据中心容灾备份规划设计
  10. 人生最大的难题是认清自己
  11. 谷歌内核浏览器无法下载文件的解决方法
  12. 传奇客户端DATA文件详细说明
  13. C语言实现24点小游戏
  14. 行为树 Behavior Tree 原理
  15. 免费天气插件jquery版本
  16. signature=c9c5777d3c4d3f66a24e97c3454c1093,DETECTING OBJECTS IN VIDEO DATA
  17. w32dasm手动汇编教程:
  18. 【libuv高效编程】libuv学习超详细教程3——libuv事件循环
  19. 孕妇各个时期阶段营养食谱(分10个月)
  20. 句子类型 - 祈使句

热门文章

  1. VisualVM远程连接Linux服务器通过jstatd方式监控JVM内存状态
  2. iOS开发那些事--创建基于故事板的iOS 6的HelloWorld
  3. MySQL学习笔记(二)—— MySQL的安装
  4. 使用SQLDMO中“接口SQLDMO.Namelist 的 QueryInterface 失败”异常的解决方法
  5. F-Secure Client Security 注册机
  6. 利用fastjson对json转map的操作
  7. 华为mate20能用鸿蒙吗,华为mate20可以用5g网络吗
  8. python实现哈希表
  9. this static 面向对象三大特点
  10. matlab %3c handle,volume browser (updated).htm 源代码在线查看 - Matlab显式三维地震数据的源代码 资源下载 虫虫电子下载站...