【C语言天天练(二一)】内联函数

        引言:调用函数时,通常会因为建立调用、传递参数、跳转到函数代码并返回等花费掉一些时间,C语言的解决办法是使用类函数宏。在C99中,还提出了另外一种方法:内联函数。

        内联函数:把函数变为内联函数将建议编译器尽可能快速地调用该函数,至于建议的效果则由实现来定义。因此,使函数变为内联函数可能会简化函数的调用机制,但也可能不起作用。内联函数是通过编译器来实现的,而宏则是在预编译的时候替换。

创建内联函数方法:在函数声明中使用函数说明符inline。

内联函数的特点:

1、类似于宏,编译器在看到内联函数声明时,就会在使用内联函数时用函数体代替函数调用,其效果就如同在此处键入了函数体的代码。如:

源码:

#include <stdio.h>
inline void eatline()	//内联函数的定义
{
	while(getchar() != '\n')
		continue;
}

int main()
{
	eatline();		//函数调用
}

通过编译器编译其实的效果如下:

#include <stdio.h>
inline void eatline()	//内联函数的定义
{
	while(getchar() != '\n')
		continue;
}

int main()
{
	while(getchar() != '\n')
		continue;
}

2、内联函数没有预留给它的单独代码块,所以无法获得内联函数的地址。

3、内联函数不会在调试器中显示。比如上面的函数即使使用了gcc -g 选项进行了编译,通过gdb调试时,也不会有eatline函数。

4、内联函数应该是比较短小。对于很长的函数,调用函数的时间少于执行函数主体的时间;此时,使用内联函数不会节省多少时间。

5、内联函数的定义和对该函数的调用必须在同一文件中,即内联函数具有内部链接。在多个文件程序中,每个调用内联函数的文件都要对该函数进行定义。达到这个目标的简单方法为:在头文件中定义内联函数,并在使用该函数的文件中包含该头文件。

6、与C++不同,C允许混合使用内联函数定义和外部函数定义。因为定义的内联函数只能在本文件中使用,而定义的外部函数,却可以通过extern进行外部声明,在其他文件中使用。如:

//file1.c
inline double square(double);
double square (double x) { return x * x; }
//file2.c
extern double square(double);
double square (double x) { return x * x; }
//file3.c
extern double square(double);
int main()
{
	double kw = square(w);
}

其中file1.c中使用的double函数时本文件中定义的内联函数,而在file2.c和file3.c中使用的double函数确实file2.c中定义的外部函数。


【C语言天天练(二一)】内联函数,布布扣,bubuko.com

时间: 2024-10-12 08:48:36

【C语言天天练(二一)】内联函数的相关文章

【C语言天天练(三)】函数

对于程序来讲,函数的地位是不言而喻的.下面先给出函数的定义,然后根据定义分析C语言中的函数. 函数定义: 类型 函数名(形式参数) 代码块 由定义可以看出函数主要包括四部分:函数类型.函数名.函数形参.函数代码块. 函数类型:指明了函数返回值的类型,是整数.浮点数.指针甚至是结构体等等.需要注意的两点:1.如果类型是void,则没有返回值.如果是void *型的返回值,那可以返回任意类型的指针,这是ANSI C标准定义的,void *可以是任意类型的指针.2.返回值的类型应该与函数定义的类型相同

嵌入式C语言自我修养 10:内联函数探究

10.1 属性声明:noinline & always_inline 这一节,接着讲 attribute 属性声明,attribute可以说是 GNU C 最大的特色.我们接下来继续讲一下跟内联函数相关的两个属性:noinline 和 always_inline.这两个属性的用途是告诉编译器:编译时,对我们指定的函数内联展开或不展开.它们的使用方法如下. static inline __attribute__((noinline)) int func(); static inline __att

C++学习之路 : 关于内联函数

(一)inline函数(摘自C++ Primer的第三版) 在函数声明或定义中函数返回类型前加上关键字inline即把min()指定为内联. inline int min(int first, int secend) {/****/}; inline函数对编译器而言必须是可见的,以便它能够在调用点内展开该函数.与非inline函数不同的是,inline函数必须在调用该函数的每个文本文件中定义.当然,对于同一程序的不同文件,如果inline函数出现的话,其定义必须相同.对于由两个文件compute

解析内联函数

一.什么是内联函数?为什么使用内联函数? 调用函数是需要一定的时间和空间的开销的. 上图表示函数调用的过程,1程序执行函数调用前的语句:2流程的控制转移到被调用函数的入口处,同时进行参数传递:3执行被调用函数中函数体语句:4流程返回到调用函数的下一条指令处,将函数返回值带回:5接着执行主调函数中未执行的部分. 在2执行之前,要记下当时指令的地址还要"保护现场"(记下当时有关的信息),以便在函数调用之后继续执行,流程返回到先前记下的地址处,并根据记录下的信息"恢复现场"

内联函数 inline

(一)inline函数(摘自C++ Primer的第三版) 在函数声明或定义中函数返回类型前加上关键字inline即把min()指定为内联. inline int min(int first, int secend) {/****/}; inline 函数对编译器而言必须是可见的,以便它能够在调用点内展开该函数.与非inline函数不同的是,inline函数必须在调用该函数的每个文本文件中定义.当然,对于同一程序的不同文件,如果inline函数出现的话,其定义必须相同.对于由两个文件comput

c++学习笔记(2)类的声名与实现的分离及内联函数

一.类的声名与实现的分离: 和c函数声明与实现分离类似 有.h : 类的声明 .cpp : 类的实现 在在一个类的cpp中应该包含本类的.h文件 在cpp中类的使用:例: 1 //Circle类 2 //Circle.h 3 class Circle{ 4 private: 5 double radious; 6 public: 7 Circle(); 8 }; 9 //Circle.pp 10 #include “Circle.h” 11 Circle::Circle(){ 12 Radius

内联函数知识点

内联函数知识点 1 内联函数是C++为提高程序运行速度所作的一项改进 编译器将使用相应的函数代码替换函数调用,嵌入在代码中.对于内联代码,程序无需跳到另一个位置处执行代码,再跳回来.因此内联函数的运行速度比常规函数稍快,但代价是占用更多内存.如果程序在10给地方调用同一个内联函数,则该程序包含十个内联函数副本. 2 有选择得使用内联 a.如果执行函数代码时间比处理函数调用机制得时间长,则节约得时间将只占整个过程的一小部分. b.函数过大不使用内联,有的编译器会不能认识. 3内联函数使用方式 a.

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

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

函数新特性、内联函数、const详解

一.函数回顾与后置返回类型 函数定义中,形参如果在函数体内用不到的话,则可以不给形参变量名字,只给其类型. 函数声明时,可以只有形参类型,没有形参名 把函数返回类型放到函数名字之前,这种写法,叫前置返回类型. C++11中,后置返回类型,在函数声明和定义中,把返回值类型放到参数列表之后. 前面放auto,表示函数返回类型放到参数列表之后,而放在参数列表之后的返回类型是通过 -> 开始的. 1 #include <iostream> 2 using namespace std; 3 4 v