html网站建设购物案例,化妆品网站建设版块,全中文软件开发工具,微信 wordpress文章目录#x1f4d5; 概念#x1f4d5; 使用前的准备#x1f4d5; 使用#x1f4d5; 特性#x1f4d5; 概念
在 C 中#xff0c;为了解决一些频繁调用的小函数大量消耗栈空间#xff08;栈内存#xff09;的问题#xff0c;特别的引入了 inline 修饰符#xff0c;表…
文章目录 概念 使用前的准备 使用 特性概念
在 C 中为了解决一些频繁调用的小函数大量消耗栈空间栈内存的问题特别的引入了 inline 修饰符表示为内联函数。栈空间就是指放置程序的局部数据也就是函数内数据的内存空间。
但是当我们使用 inline 修饰一个函数的时候在调用该函数的地方编译器就有可能会直接将函数在那里展开而不是 call 这个函数。 为什么这里说 “有可能” 呢这是因为inline 只是相当于给编译器一个 “建议” 最终是直接展开还是使用函数调用是由编译器自己来决定的。 使用前的准备
在 debug 模式下需要对编译器进行设置否则不会展开因为debug模式下编译器默认不 会对代码进行优化下面是对 VS2019 进行设置的方法。
首先点击最上方菜单栏的 “项目” 然后在跳出的菜单栏中点击最下方的 “属性”。 其次进行下面两张图片的设置。修改红色方框的内容改成图中所示。 使用
#includeiostream
using namespace std;int Add(int x, int y)
{int ret x y;return ret;
}inline int Min(int x, int y)
{int ret x - y;return ret;
}int main()
{Add(10, 15);Min(10, 15);return 0;
}如上是测试代码按下 F10进入调试状态然后转到反汇编查看汇编代码。下图中可以明显看出来内联函数 Min 是直接展开的而 Add 是调用函数。 特性
inline是一种以空间换时间的做法如果编译器将函数当成内联函数处理在编译阶段会 用函数体替换函数调用缺陷可能会使目标文件变大优势少了调用开销提高程序运 行效率。inline对于编译器而言只是一个建议不同编译器关于inline实现机制可能不同一般建 议将函数规模较小即函数不是很长具体没有准确的说法取决于编译器内部实现、不是递归、且频繁调用的函数采用inline修饰否则编译器会忽略inline特性。inline不建议声明和定义分离分离会导致链接错误。因为inline被展开就没有函数地址了链接就会找不到。
关于上方的最后一点是建议直接将 inline 函数的定义直接放在头文件里面而不是声明和定义分离。如下内联函数没有申明而是直接定义。
如下图如果将声明和定义分离编译的时候就会报错。 首先看左边箭头所指处可以看出是 Min() 函数出错错误是无法解析。 其次看右边箭头所指的地方发现出错的文件是 obj 类型可以知道是链接的时候出错。
再根据程序翻译的过程这个预备知识其实是合并符号表和重定位的过程出错为什么因为 内联函数在文件预处理阶段就已经展开并不并入到符号表中去编辑器没有给函数开辟空间所以内联函数是没有地址的。在函数调用时即使函数声明展开也是无法找到函数的。 以上就是对 inline 内联函数的简单介绍以及它的一些特性在编写一些行数较少的函数时就可以考虑使用内联函数但是不要忘了内联函数不能声明和定义分离