内联函数、默认参数和函数占位参数

内联函数

定义:内联函数从源代码层看,有函数的结构,而在编译后,却不具备函数的性质。内联函数不是在调用时发生控制转移,而是在编译时将函数体嵌入在每一个调用处。编译时,类似宏替换,使用函数体替换调用处的函数名。一般在代码中用inline修饰,但是能否形成内联函数,需要看编译器对该函数定义的具体处理。

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

const int A = 3; ? #define A 3

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

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

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

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

#include "iostream"
using namespace std;
#define MYFUNC(a, b) ((a) < (b) ? (a) : (b))
inline int myfunc(int a, int b)
{
	return a < b ? a : b;
}
int main()
{
    int a = 1;
    int b = 3;
    //int c = myfunc(++a, b);
    int c = MYFUNC(++a, b);
    printf("a = %d\n", a);
    printf("b = %d\n", b);
    printf("c = %d\n", c);
    printf("Press enter to continue ...");
    system("pause");
    return 0;
}

说明1:

必须inline int myfunc(inta, int b)和实现的地方,写在一块。

说明2:

C++编译器可以将一个函数进行内联编译,被C++编译器内联编译的函数叫做内联函数;

内联函数在最终生成的代码中是没有定义的;

C++编译器直接将函数体插入函数调用的地方;

内联函数没有普通函数调用时的额外开销(压栈,跳转,返回)。

说明3:

C++编译器不一定准许函数的内联请求!

说明4:

内联函数是一种特殊的函数,具有普通函数的特征(参数检查,返回类型等)。

内联函数是对编译器的一种请求,因此编译器可能拒绝这种请求。

内联函数由编译器处理,直接将编译后的函数体插入调用的地方。

宏代码片段由预处理器处理,进行简单的文本替换,没有任何编译过程。

说明5:

现代C++编译器能够进行编译优化,因此一些函数即使没有inline声明,也可能被编译器内联编译。

另外,一些现代C++编译器提供了扩展语法,能够对函数进行强制内联如:g++中的__attribute__((always_inline))属性。

说明6:

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

不能存在任何形式的循环语句 ;

不能存在过多的条件判断语句;

函数体不能过于庞大;

不能对函数进行取址操作;

函数内联声明必须在调用语句之前;

编译器对于内联函数的限制并不是绝对的,内联函数相对于普通函数的优势只是省去了函数调用时压栈,跳转和返回的开销。因此,当函数体的执行开销远大于压栈,跳转和返回所用的开销时,那么内联将无意义。

结论:

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

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

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

默认参数

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

void myPrint(int x = 3)
{
	printf("x:%d", x);
}

函数默认参数的规则:

只有参数列表后面部分的参数才可以提供默认参数值。

一旦在一个函数调用中开始使用默认参数值,那么这个参数后的所有参数都必须使用默认参数值。

函数占位参数

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

int func(int a, int b, int )
{
	return a + b;
}
int main(int argc, char *argv[])
{
	printf("func(1, 2, 3) = %d\n", func(1, 2, 3));
	printf("Press enter to continue ...");
	getchar();
	return 0;
}

转载请注明:http://blog.csdn.net/lsh_2013/article/details/45421293

时间: 2024-12-11 06:07:55

内联函数、默认参数和函数占位参数的相关文章

C语言中递归什么时候可以省略return引发的思考:通过内联汇编解读C语言函数return的本质

事情的经过是这样的,博主在用C写一个简单的业务时使用递归,由于粗心而忘了写return.结果发现返回的结果依然是正确的.经过半小时的反汇编调试,证明了我的猜想,现在在博客里分享.也是对C语言编译原理的一次加深理解. 引子: 首先我想以一道题目引例,比较能体现出问题. 例1: #include <stdio.h> /** 函数功能:用递归实现位运算加法 */ int Add_Recursion(int a,int b) { int carry_num = 0, add_num = 0; if (

C语言中递归什么时候能够省略return引发的思考:通过内联汇编解读C语言函数return的本质

事情的经过是这种,博主在用C写一个简单的业务时使用递归,因为粗心而忘了写return.结果发现返回的结果依旧是正确的.经过半小时的反汇编调试.证明了我的猜想,如今在博客里分享.也是对C语言编译原理的一次加深理解. 引子: 首先我想以一道题目引例,比較能体现出问题. 例1: #include <stdio.h> /** 函数功能:用递归实现位运算加法 */ int Add_Recursion(int a,int b) { int carry_num = 0, add_num = 0; if (b

C++ 内联函数 摘自 C++ 应用程序性能优化

内联函数 在C++语言的设计中,内联函数的引入可以说完全是为了性能的考虑.因此在编写对性能要求比较高的C++程序时,非常有必要仔细考量内联函数的使用. 所谓"内联",即将被调用函数的函数体代码直接地整个插入到该函数被调用处,而不是通过call语句进行.当然,编译器在真正进行"内联"时,因为考虑到被内联函数的传入参数.自己的局部变量,以及返回值的因素,不仅仅只是进行简单的代码拷贝,还需要做很多细致的工作,但大致思路如此. 开发人员可以有两种方式告诉编译器需要内联哪些类

函数内联 inline,__inline,__forceinline

? 感谢大佬的总结[http://www.cnblogs.com/xuemaxiongfeng/articles/2464850.html] ● 存储限定符 __inline 与关键字 inline 的语义完全相同,不影响函数的类型,建议编译器在合理的情况下内联编译 C/C++ 函数 ● 内联减少了函数调用的开销,但却增加了代码量 ● inline 仅用于 C++,__inline和 __forceinline 用于 C/C++ ● 编译器处理内联的情况: ■ 使用 /clr 编译选项时,如果函

关于C++内联函数

关于C++内联函数有以下实验: 有三段测试代码 1.手动展开内联函数. 2.非内联函数. 3.inline标记的内联函数.(函数只有一行代码,以确保函数被内联) 测试三种情况: VS工程在Release版下的有关内联的三个设置选项 1./Ob0 禁用内联展开(默认情况下是打开的). 2./Ob1 只展开标记为 inline 或 __inline 的函数,或在类声明内定义的 C++ 成员函数中的函数. 3./Ob2 展开标记为 inline 或 __inline 的函数和编译器选择的任何其他函数(

转-C++之虚函数不能定义成内联函数的原因

转自:https://blog.csdn.net/flydreamforever/article/details/61429140 在C++中,inline关键字和virtual关键字分别用来定义c++中的内联函数和虚函数,他们在各自的场合都有其各自的应用,下面将简单介绍他们各自的功能,然后在说明为什么一个函数不能同时是虚函数和内联函数(inline). 一.内联函数(inline)内联函数的目的是为了减少函数调用时间.它是把内联函数的函数体在编译器预处理的时候替换到函数调用处,这样代码运行到这

内联函数与虚函数

如果函数已经被声明为inline, 内联函数已经在编译期间它的调用点上就被展开; 而虚拟函数调用的决定则要等到运行时刻在执行程序内部的每个调用点上系统根据被调用对象的实际基类或派生类的类型来决定选择哪一个虚拟函数实例. 内联不是强制性的,你只是向编译器提出这个建议,允许它在可以内联的时候采取内联形式.而虚函数本身就是一个函数,只是在多态的情况下,它要到执行时才能确定调用的函数,所以这样的特性阻止了虚函数的内联.但,要注意,只是在多态的情况下(多态不用我解释吧).如果是静态的调用,编译器还是会采用

C++ 内联函数inline

http://blog.csdn.net/u011327981/article/details/50601800 1.  内联函数 在C++中我们通常定义以下函数来求两个整数的最大值: 复制代码 代码如下: int max(int a, int b){ return a > b ? a : b;} 为这么一个小的操作定义一个函数的好处有: ① 阅读和理解函数 max 的调用,要比读一条等价的条件表达式并解释它的含义要容易得多 ② 如果需要做任何修改,修改函数要比找出并修改每一处等价表达式容易得多

Inline 内联函数

Inline函数,即内联函数,它是把函数内部的代码直接插入到调用者代码处的函数,也就是该函数不是通过子函数调用这种常见的方式来实现的,而是直接替换到函数调用处(这点上有点类似#define宏),由此带来的优势就是省去了调用/返回指令,通过避免调用带来的开销(包括函数调用带来的额外的执行周期和堆栈的使用)来提高代码的执行效率,而又同时保留了函数封装形式带来的可读性,很好用吧有木有,下面就让我们看看具体的使用形式: /****************函数声明部分*****************/

C++内联函数的使用

1.为什么要用内联函数? 在C++中我们通常定义以下函数来求两个整数的最大值: int max(int a, int b) { return a > b ? a : b; } 为这么一个小的操作定义一个函数的好处有: ① 阅读和理解函数 max 的调用,要比读一条等价的条件表达式并解释它的含义要容易得多 ② 如果需要做任何修改,修改函数要比找出并修改每一处等价表达式容易得多 ③ 使用函数可以确保统一的行为,每个测试都保证以相同的方式实现 ④ 函数可以重用,不必为其他应用程序重写代码 虽然有这么多