- 浏览: 31959 次
- 性别:
- 来自: 南京
文章分类
最新评论
在C++中,宏的概念是作为内联函数来实现的。
内联函数无论从哪方面说都是真正的函数,唯一不同之处在于内联函数在适当的地方像宏一样展开,所以不需要函数调用的开销。因此,应该(几乎)永远不要使用宏,只使用内联函数。
任何在类中定义的函数(不包括在类中声明,在类外定义的成员函数)自动地成为内联函数,但也可以在非类的函数前加上inline关键字使之成为内联函数。但为了使之有效,必须使函数体和声明结合在一起,否则,编译器将它作为普通函数对待。
原理:
一般应该把内联定义放在头文件里。当编译器看到这个定义时,它把函数类型(函数名+返回值)和函数体放到符号表里。当使用函数时,编译器检查以确保调用是正确的且返回值被正确使用,然后将函数调用替换为函数体,因而消除开销。
内联代码的确占据空间,但假如函数较小,这实际上比为了一个普通函数而产生的代码(参数压栈和执行CALL)占用的空间还要小。
使用内联函数的目的是减少函数调用的开销,但是假如函数较大,由于在每处调用的地方都有复制代码,将使得代码膨胀。
限制:
1. 假如函数太复杂,编译器将不能执行内联,这取决于编译器。
2. 假如要显式地或者隐式地取函数地址,编译器也不能执行内联。
为了保持接口清楚,所有的方法最好都在类外面定义,这并不妨碍最优化,对适合内聚的函数使用inline即可。
内联函数无论从哪方面说都是真正的函数,唯一不同之处在于内联函数在适当的地方像宏一样展开,所以不需要函数调用的开销。因此,应该(几乎)永远不要使用宏,只使用内联函数。
任何在类中定义的函数(不包括在类中声明,在类外定义的成员函数)自动地成为内联函数,但也可以在非类的函数前加上inline关键字使之成为内联函数。但为了使之有效,必须使函数体和声明结合在一起,否则,编译器将它作为普通函数对待。
原理:
一般应该把内联定义放在头文件里。当编译器看到这个定义时,它把函数类型(函数名+返回值)和函数体放到符号表里。当使用函数时,编译器检查以确保调用是正确的且返回值被正确使用,然后将函数调用替换为函数体,因而消除开销。
内联代码的确占据空间,但假如函数较小,这实际上比为了一个普通函数而产生的代码(参数压栈和执行CALL)占用的空间还要小。
使用内联函数的目的是减少函数调用的开销,但是假如函数较大,由于在每处调用的地方都有复制代码,将使得代码膨胀。
限制:
1. 假如函数太复杂,编译器将不能执行内联,这取决于编译器。
2. 假如要显式地或者隐式地取函数地址,编译器也不能执行内联。
为了保持接口清楚,所有的方法最好都在类外面定义,这并不妨碍最优化,对适合内聚的函数使用inline即可。
发表评论
-
C++强制类型转换
2010-09-29 23:50 810C++同时提供了四种新的 ... -
拷贝构造函数和赋值函数
2010-09-29 20:04 827-- C++中拷贝构造函数被调用的三种情形 1) 一个对象 ... -
构造函数和析构函数
2010-09-29 19:17 655-- 析构函数可以为virtual类型,而构造函数则不能。构造 ... -
sizeof相关问题
2010-09-29 17:07 6871. sizeof的概念: sizeof是C的一种单目运 ... -
scanf
2010-09-29 10:57 619scanf -
定义&赋值&初始化
2010-09-18 23:26 772定义一个变量,就是分配一块存储空间并给它命名; 给一个变量赋值 ... -
“连接”相关细节
2010-09-18 19:42 614在一个执行程序中,标识符代表存放变量或者被编译过的 ... -
C++虚函数机制
2010-09-18 15:29 1087典型的编译器 ... -
引用的相关重点
2010-09-18 15:15 603引用的主要用途是为了描述函数的参数和返回值,特别是 ... -
虚继承的构造函数调用问题
2010-09-18 14:27 2200在某一个虚基类的任何 ... -
动态联编与静态联编
2010-09-18 14:23 812#include <iostream> ... -
static在不同地方的含义
2010-09-18 13:52 8441. 源文件中定义函数使用的static表示的是访问权限:只有 ... -
头文件中的名字空间
2010-09-18 13:41 736不要在头文件中放置使用指令,使用指令的通常形式是: using ... -
为什么不能通过返回值重载
2010-09-18 13:33 1138为什么只能通过范围和参数来重载,而不能通过返回值呢? ... -
编译C程序的详细过程
2010-09-16 00:04 718编译的概念:编译程序 ... -
标准I/O库
2010-09-15 23:58 628标准I/O库及其头文件stdio.h为底层I/O系统提供了一个 ...
相关推荐
对 C++ 内联函数进行了说明
内联函数体要放在头文件中。基本知识。需要的可以看。
c++中的宏、内联函数和宏的比较 c++中的宏、内联函数和宏的比较 c++中的宏、内联函数和宏的比较 c++中的宏、内联函数和宏的比较 c++中的宏、内联函数和宏的比较
对内联函数与普通函数的一些比较与分析.doc
自己整理的内联函数相关知识。 一、inline 关键字用来定义一个类的内联函数,引入它的主要原因是用它替代C中表达式形式的宏定义。 表达式形式的宏定义一例: #define ExpressionName(Var1,Var2) ((Var1)+(Var2))*(...
本文主要介绍了预处理宏和内联函数的区别,转载的,希望大家一起分享
内联函数的定义格式、编程风格、优缺点、使用注意事项,以及与宏的区别
内联函数及三种重载代码,C++实习经常用到的代码内容
内联函数和宏的区别,这是好多新手容易感觉困扰的地方 ,我也曾经困惑,故分享此资料,希望共同进步
2、掌握内联函数概念及用法 实验环境: VC++6.0 ;Clion;Visual Studio 2019 ; Visual Studio code 实验内容: ①在主函数给出数据,利用函数重载,分别求出三角形,梯形,圆的面积 ② 利用内联函数编程求出自然数1~10中...
MATLAB中的内联函数借鉴了C语言中的内联函数,在C语言中,内联函数是通过编译器控制来实现的,它只在需要用到的时候,内联函数像宏一样的展开,所以取消了函数的参数压栈,减少了调用的时间和空间开销。在MATLAB中也...
arm算法优化编程手册,提供armv7 armv8的所有内联指令
内联函数在运行时可调试,而宏定义不可以;2.编译器会对内联函数的参数类型做安全检查或自动类型转换(同普通函数),而宏定义则不会; 3.内联函数可以访问类的成员变量,宏定义则不能; 4.在类中声明同时定义的成员...
内联函数的执行过程与带参数宏定义很相似,但参数的处理不同。带参数的宏定义并不对参数进行运算,而是直接替换;内联函数首先是函数,这就意味着函数的很多性质都适用于内联函数,即内联函数先把参数表达式进行运算...
主要介绍了Python 如何定义匿名或内联函数,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下
本项目是控制台调用内联函数inline 使用实例
4_递归函数和内联函数.tif
ARM 底层指令集,用于嵌入式开发,用于提升性能的开发手册和文档,通常C语言开发使用内联函数指令
VC中内联函数的定义和案例共3页.pdf.zip