C语言 inline类型函数
2012-04-27 11:00
190 查看
原文来自http://blog.chinaunix.net/space.php?uid=1835494&do=blog&id=2831760,先谢过,分析挺好的!
选择inline类型的函数是有条件的
·函数足够简单,并且非常频繁被调用,只有一条程序就可以完成任务
·不能包含复杂的结构控制语句例如while switch
-------------------------------------------------
C 内联函数(inline)
什么是内联函数
内联函数是为了解决C 预处理器宏存在的问题所提出一种解决方案,用来提高函数使用效率
内联函数定义
内联函数使用inline关键字定义,
并且函数体和申明必须结合在一起,
否则编译器将他作为普通函数对待。
inline void function(int x); //仅仅是申明函数,没有任何效果
inline void function(int x) //正确
{
return x;
}
在类内部定义的函数自动的为内联函数,
不需要加关键字inline。
class point
{
int i;
public:
void SetValue(int x) //内联函数
{
i = x;
}
}
内联函数和普通函数的区别
普通函数:
编译器在它的符号表中放入函数类型(包含名字和参数类型的函数原型及函数的返回类型)。
内联函数:
函数的代码也被放入符号表,代码是以源程序形式还是以编译过的汇编指令形式存放取决于编译器。
当内联函数太复杂,编译器将不能执行内联。
-------------------------------------------------------------
在c 中,为了解决一些频繁调用的小涵数大量消耗栈空间或者是叫栈内存的问题,特别的引入了inline修饰符,表示为内联涵数。
可能说到这里,很多人还不明白什么是栈空间,其实栈空间就是指放置程序的局部数据也就是函数内数据的内存空间,在系统下,栈空间是有限的,如果频繁大量的使用就会造成因栈空间不足所造成的程序出错的问题,涵数的死循环递归调用的最终结果就是导致栈内存空间枯竭。
下面我们来看一个例子
//程序作者:管宁
//站点:www.cndev-lab.com
//所有稿件均有版权,如要转载,请务必著名出处和作者
#include <iostream>
#include <string>
using namespace std;
inline string dbtest(int a); //函数原形声明为inline即:内联涵数
void main()
{
for (int i=1;i<=10;i )
{
cout << i << ":" << dbtest(i) << endl;
}
cin.get();
}
string dbtest(int a)//这里不用再次inline,当然加上inline也是不会出错的
{
return (a%2>0)?"奇":"偶";
}
上面的例子就是标准的内联涵数的用法,使用inline修饰带来的好处我们表面看不出来,其实在内部的工作就是在每个for循环的内部所有调用dbtest(i)的地方都换成了(i%2>0)?"奇":"偶"这样就避免了频繁调用函数对栈内存重复开辟所带来的消耗。
说到这里很多人可能会问,既然inline这么好,还不如把所谓的函数都声明成inline,嗯,这个问题是要注意的,inline的使用是有所限制的,inline只适合涵数体内代码简单的涵数使用,不能包含复杂的结构控制语句例如while switch,并且不能内联函数本身不能是直接递归函数(自己内部还调用自己的函数)。
说到这里我们不得不说一下在c语言中广泛被使用的#define语句,是的define的确也可以做到inline的这些工作,但是define是会产生副作用的,尤其是不同类型参数所导致的错误,由此可见inline有更强的约束性和能够让编译器检查出更多错误的特性,在c 中是不推荐使用define的。
选择inline类型的函数是有条件的
·函数足够简单,并且非常频繁被调用,只有一条程序就可以完成任务
·不能包含复杂的结构控制语句例如while switch
-------------------------------------------------
C 内联函数(inline)
什么是内联函数
内联函数是为了解决C 预处理器宏存在的问题所提出一种解决方案,用来提高函数使用效率
内联函数定义
内联函数使用inline关键字定义,
并且函数体和申明必须结合在一起,
否则编译器将他作为普通函数对待。
inline void function(int x); //仅仅是申明函数,没有任何效果
inline void function(int x) //正确
{
return x;
}
在类内部定义的函数自动的为内联函数,
不需要加关键字inline。
class point
{
int i;
public:
void SetValue(int x) //内联函数
{
i = x;
}
}
内联函数和普通函数的区别
普通函数:
编译器在它的符号表中放入函数类型(包含名字和参数类型的函数原型及函数的返回类型)。
内联函数:
函数的代码也被放入符号表,代码是以源程序形式还是以编译过的汇编指令形式存放取决于编译器。
当内联函数太复杂,编译器将不能执行内联。
-------------------------------------------------------------
在c 中,为了解决一些频繁调用的小涵数大量消耗栈空间或者是叫栈内存的问题,特别的引入了inline修饰符,表示为内联涵数。
可能说到这里,很多人还不明白什么是栈空间,其实栈空间就是指放置程序的局部数据也就是函数内数据的内存空间,在系统下,栈空间是有限的,如果频繁大量的使用就会造成因栈空间不足所造成的程序出错的问题,涵数的死循环递归调用的最终结果就是导致栈内存空间枯竭。
下面我们来看一个例子
//程序作者:管宁
//站点:www.cndev-lab.com
//所有稿件均有版权,如要转载,请务必著名出处和作者
#include <iostream>
#include <string>
using namespace std;
inline string dbtest(int a); //函数原形声明为inline即:内联涵数
void main()
{
for (int i=1;i<=10;i )
{
cout << i << ":" << dbtest(i) << endl;
}
cin.get();
}
string dbtest(int a)//这里不用再次inline,当然加上inline也是不会出错的
{
return (a%2>0)?"奇":"偶";
}
上面的例子就是标准的内联涵数的用法,使用inline修饰带来的好处我们表面看不出来,其实在内部的工作就是在每个for循环的内部所有调用dbtest(i)的地方都换成了(i%2>0)?"奇":"偶"这样就避免了频繁调用函数对栈内存重复开辟所带来的消耗。
说到这里很多人可能会问,既然inline这么好,还不如把所谓的函数都声明成inline,嗯,这个问题是要注意的,inline的使用是有所限制的,inline只适合涵数体内代码简单的涵数使用,不能包含复杂的结构控制语句例如while switch,并且不能内联函数本身不能是直接递归函数(自己内部还调用自己的函数)。
说到这里我们不得不说一下在c语言中广泛被使用的#define语句,是的define的确也可以做到inline的这些工作,但是define是会产生副作用的,尤其是不同类型参数所导致的错误,由此可见inline有更强的约束性和能够让编译器检查出更多错误的特性,在c 中是不推荐使用define的。
选择inline类型的函数是有条件的
·函数足够简单,并且非常频繁被调用,只有一条程序就可以完成任务
·不能包含复杂的结构控制语句例如while switch
-------------------------------------------------
C 内联函数(inline)
什么是内联函数
内联函数是为了解决C 预处理器宏存在的问题所提出一种解决方案,用来提高函数使用效率
内联函数定义
内联函数使用inline关键字定义,
并且函数体和申明必须结合在一起,
否则编译器将他作为普通函数对待。
inline void function(int x); //仅仅是申明函数,没有任何效果
inline void function(int x) //正确
{
return x;
}
在类内部定义的函数自动的为内联函数,
不需要加关键字inline。
class point
{
int i;
public:
void SetValue(int x) //内联函数
{
i = x;
}
}
内联函数和普通函数的区别
普通函数:
编译器在它的符号表中放入函数类型(包含名字和参数类型的函数原型及函数的返回类型)。
内联函数:
函数的代码也被放入符号表,代码是以源程序形式还是以编译过的汇编指令形式存放取决于编译器。
当内联函数太复杂,编译器将不能执行内联。
-------------------------------------------------------------
在c 中,为了解决一些频繁调用的小涵数大量消耗栈空间或者是叫栈内存的问题,特别的引入了inline修饰符,表示为内联涵数。
可能说到这里,很多人还不明白什么是栈空间,其实栈空间就是指放置程序的局部数据也就是函数内数据的内存空间,在系统下,栈空间是有限的,如果频繁大量的使用就会造成因栈空间不足所造成的程序出错的问题,涵数的死循环递归调用的最终结果就是导致栈内存空间枯竭。
下面我们来看一个例子
//程序作者:管宁
//站点:www.cndev-lab.com
//所有稿件均有版权,如要转载,请务必著名出处和作者
#include <iostream>
#include <string>
using namespace std;
inline string dbtest(int a); //函数原形声明为inline即:内联涵数
void main()
{
for (int i=1;i<=10;i )
{
cout << i << ":" << dbtest(i) << endl;
}
cin.get();
}
string dbtest(int a)//这里不用再次inline,当然加上inline也是不会出错的
{
return (a%2>0)?"奇":"偶";
}
上面的例子就是标准的内联涵数的用法,使用inline修饰带来的好处我们表面看不出来,其实在内部的工作就是在每个for循环的内部所有调用dbtest(i)的地方都换成了(i%2>0)?"奇":"偶"这样就避免了频繁调用函数对栈内存重复开辟所带来的消耗。
说到这里很多人可能会问,既然inline这么好,还不如把所谓的函数都声明成inline,嗯,这个问题是要注意的,inline的使用是有所限制的,inline只适合涵数体内代码简单的涵数使用,不能包含复杂的结构控制语句例如while switch,并且不能内联函数本身不能是直接递归函数(自己内部还调用自己的函数)。
说到这里我们不得不说一下在c语言中广泛被使用的#define语句,是的define的确也可以做到inline的这些工作,但是define是会产生副作用的,尤其是不同类型参数所导致的错误,由此可见inline有更强的约束性和能够让编译器检查出更多错误的特性,在c 中是不推荐使用define的。
选择inline类型的函数是有条件的
·函数足够简单,并且非常频繁被调用,只有一条程序就可以完成任务
·不能包含复杂的结构控制语句例如while switch
-------------------------------------------------
C 内联函数(inline)
什么是内联函数
内联函数是为了解决C 预处理器宏存在的问题所提出一种解决方案,用来提高函数使用效率
内联函数定义
内联函数使用inline关键字定义,
并且函数体和申明必须结合在一起,
否则编译器将他作为普通函数对待。
inline void function(int x); //仅仅是申明函数,没有任何效果
inline void function(int x) //正确
{
return x;
}
在类内部定义的函数自动的为内联函数,
不需要加关键字inline。
class point
{
int i;
public:
void SetValue(int x) //内联函数
{
i = x;
}
}
内联函数和普通函数的区别
普通函数:
编译器在它的符号表中放入函数类型(包含名字和参数类型的函数原型及函数的返回类型)。
内联函数:
函数的代码也被放入符号表,代码是以源程序形式还是以编译过的汇编指令形式存放取决于编译器。
当内联函数太复杂,编译器将不能执行内联。
-------------------------------------------------------------
在c 中,为了解决一些频繁调用的小涵数大量消耗栈空间或者是叫栈内存的问题,特别的引入了inline修饰符,表示为内联涵数。
可能说到这里,很多人还不明白什么是栈空间,其实栈空间就是指放置程序的局部数据也就是函数内数据的内存空间,在系统下,栈空间是有限的,如果频繁大量的使用就会造成因栈空间不足所造成的程序出错的问题,涵数的死循环递归调用的最终结果就是导致栈内存空间枯竭。
下面我们来看一个例子
//程序作者:管宁
//站点:www.cndev-lab.com
//所有稿件均有版权,如要转载,请务必著名出处和作者
#include <iostream>
#include <string>
using namespace std;
inline string dbtest(int a); //函数原形声明为inline即:内联涵数
void main()
{
for (int i=1;i<=10;i )
{
cout << i << ":" << dbtest(i) << endl;
}
cin.get();
}
string dbtest(int a)//这里不用再次inline,当然加上inline也是不会出错的
{
return (a%2>0)?"奇":"偶";
}
上面的例子就是标准的内联涵数的用法,使用inline修饰带来的好处我们表面看不出来,其实在内部的工作就是在每个for循环的内部所有调用dbtest(i)的地方都换成了(i%2>0)?"奇":"偶"这样就避免了频繁调用函数对栈内存重复开辟所带来的消耗。
说到这里很多人可能会问,既然inline这么好,还不如把所谓的函数都声明成inline,嗯,这个问题是要注意的,inline的使用是有所限制的,inline只适合涵数体内代码简单的涵数使用,不能包含复杂的结构控制语句例如while switch,并且不能内联函数本身不能是直接递归函数(自己内部还调用自己的函数)。
说到这里我们不得不说一下在c语言中广泛被使用的#define语句,是的define的确也可以做到inline的这些工作,但是define是会产生副作用的,尤其是不同类型参数所导致的错误,由此可见inline有更强的约束性和能够让编译器检查出更多错误的特性,在c 中是不推荐使用define的。
相关文章推荐
- C语言 inline类型函数
- C语言中变量和函数类型
- Android JNI编程(二)——C语言的基本数据类型,输出函数,输入函数
- 【C语言】[库函数]:printf 函数 和 scanf 函数 对float 和double 类型打印和读取
- 文件类型,c语言文件读写,文件缓冲,文件打开方式,文件操作函数
- c语言 inline函数的总结
- C语言自学《二》下篇---- 类型的转换、字符类型、枚举、数学函数
- c语言中的的内联(inline)函数
- c语言 inline函数的总结
- C语言技巧【枚举作为函数变量类型】【数据输入与输出】【do while循环体内scanf函数被跳过,循环结束】【用const修饰函数的参数】
- 类的成员函数的理解——类的成员函数有4种类型inline、virtual、static、normal
- C语言数组类型以及函数类型的定义
- 黑马程序员——C语言——常见内存分配函数和构造类型
- 关于C语言static定义函数类型的具体解释
- c语言头文件定义inline函数
- c语言基本数据类型和常用常量及函数
- C语言大世界—————08指针类型(函数指针)上
- c语言如何操作内存(数据类型、函数在内存中解析简介)
- C语言回顾(六、基类型,数组指针,字符串指针,函数指针,文字常量区)——iOS开发基础
- Android JNI编程之基础学习(一) 认识c语言的基本类型,输出输入函数