C++回忆录:(二)inline内联函数
2015-07-26 15:24
190 查看
在C/C++语言中,函数调用会涉及到函数的入栈和出栈,比如下面的例子:
在主函数中调用myprint函数打字2这个数字,我们就要调用函数100次,意味着这个函数要进栈100次,出栈100次,这样我们就打印一个小小的2就要把时间花费在进栈和出栈上了,当我们把程序改为如下所示时:
当然无论任何事,得到了一定的方便之后就必须得付出一定的代价,即此时的空间的问题。打个比方,现在我们要去一个超市买东西,而超市距离我们家有好几里路,此时你要话费一定的时间在去超市的路上,可是现在呢超市已经搬到家里了,我们就没有必要去超市了,因为超市已经在家里了,当然你的家有那么大?能容得下一个超市?所以此时就存在一个空间的问题,即你必须扩大你家,才能够容纳的下一个超市。
对于内存来说也是一样的,减少了对栈的进出时间的开销,我们却扩大了主存的空间来容纳本来在栈里的函数,在C语言中实现这一功能是用内联函数inline来实现的。
这就是inline函数的作用!
实际上,即使没有手工指定inline函数,编译器一般还会选择一些代码量较小但使用频繁的函数作为inline函数,以此作为性能优化的途径之一。
与带参宏定义相比,inline函数具备以下优点:
参数类型检查:宏定义中所使用的参数仅仅是在宏定义中被替换,不进行任何的类型检查
返回值:宏定义中无法使用return返回
便于调试
Void myprint() { Printf("%d",3); } Void main() { Int i; For(i=0;i<100;i++) Myprint(2); }
在主函数中调用myprint函数打字2这个数字,我们就要调用函数100次,意味着这个函数要进栈100次,出栈100次,这样我们就打印一个小小的2就要把时间花费在进栈和出栈上了,当我们把程序改为如下所示时:
Void main() { Int i; For(i=0;i<100;i++) Void myprint() { Printf("%d",3); } } 此时相当于 static inline void myprint(int n); static inline void myprint(int n) { printf("%d",n); } void main() { int i; for(i=0;i<100;i++) myprint(3); }此时,我们就不需要进栈出栈了,直接打印2就可以了。
当然无论任何事,得到了一定的方便之后就必须得付出一定的代价,即此时的空间的问题。打个比方,现在我们要去一个超市买东西,而超市距离我们家有好几里路,此时你要话费一定的时间在去超市的路上,可是现在呢超市已经搬到家里了,我们就没有必要去超市了,因为超市已经在家里了,当然你的家有那么大?能容得下一个超市?所以此时就存在一个空间的问题,即你必须扩大你家,才能够容纳的下一个超市。
对于内存来说也是一样的,减少了对栈的进出时间的开销,我们却扩大了主存的空间来容纳本来在栈里的函数,在C语言中实现这一功能是用内联函数inline来实现的。
这就是inline函数的作用!
实际上,即使没有手工指定inline函数,编译器一般还会选择一些代码量较小但使用频繁的函数作为inline函数,以此作为性能优化的途径之一。
与带参宏定义相比,inline函数具备以下优点:
参数类型检查:宏定义中所使用的参数仅仅是在宏定义中被替换,不进行任何的类型检查
返回值:宏定义中无法使用return返回
便于调试
相关文章推荐
- VC++匈牙利命名法
- C++中的const对象与缺省构造函数问题
- C语言统计不同字符的字数
- C语言结构体
- poj1502 MPI Maelstrom 直接Dijkstra
- C++的逆波兰表达式的求解
- [LeetCode] Kth Smallest Element in a BST
- VC++中的字符问题
- C++中构造函数调用构造函数
- C++的头文件和实现文件分别写什么
- C++类中静态变量和静态方法的注意事项
- 【转】C/C++中可变参数的详细介绍(va_list,va_start,va_arg,va_end)
- C++ 代码换行
- [C++]_[初级]_[pthread多线程之生产者消费者模型]
- 关于C语言的传值问题
- C语言函数指针
- C++利用stl::sort对结构体数组中的字符串成员排序
- 有关c语言的++与--
- C++ 异常处理流程
- C++ 无名对象