首页 > 编程语言 >C++语法·三

C++语法·三

时间:2024-11-12 15:45:17浏览次数:3  
标签:函数 C++ 语法 编译 编译器 内联 inline 展开

内联函数(inline)

简介:

用inline修饰的函数叫内联函数,编译时C++编译器会在调用的地方站开内联函数,这样调用函数就不需要创建栈帧了,可以提高效率。

内联函数与宏函数:C++中的内联函数与C中的宏函数很相似,都是直接在预处理时展开函数,将函数直接替换到调用位置,不额外创建栈帧。但内联函数相比宏函数做了优化。内联函数本意上是要代替宏,因为太复杂的宏替换时容易出错。

使用说明:

1.inline的建议

inline 实际上对于编译器来说只是一个建议,在代码行数少的时候编译器会进行展开,而代码行数较多的时候(不同编译器可能对于多的标准不同),编译器不会展开内联函数,因为展开会大大增加代码量,会导致在预处理的步骤产生过多的指令,降低效率。

比如递归函数或者代码行数较多的函数加上inline,编译器也不会展开。

注意:VS编译器debug版本下默认不展开inline,方便调试。

下面是汇编指令,其中call 的那一行就是为函数创建了栈帧,是函数未展开在程序中的情况,如果是inline函数并且符合展开要求,则不会出现call这一行创建栈帧。

2.inline的不分离

inline不建议声明和定义分离到两个文件,分离会导致链接错误。

这里想要理解需要懂得东西有些多,如下:

编译和链接(简单来说)

编译分为三个阶段:预处理、编译、汇编。

预处理:进行宏的展开、条件编译指令、去注释、头文件展开等操作。

编译:进行词法分析、语法分析、语义分析、优化、生成汇编代码

汇编:将汇编代码转换成机器可执行指令。

在编译的语义分析阶段,会创建并更新符号表。(符号表:一种数据结构,用来存储程序中所有标识符的相关信息)标识符:如变量名、函数名等。

链接时,声明用来告诉编译器实体的存在,定义用来提供实体的实际代码或数据。(实体指C++中的对象,可以是变量、函数、类等)

定义和声明

声明指告诉编译器一个标识符(如变量名或函数名)的名称和类型,但不分配存储空间。只要是一致的,就可以多次出现。

变量和函数声明:只声明,不分配内存

定义指为实体(变量、函数、类等)提供具体实现或储存分配。

注意:初始化不等同于定义,有时不初始化也可以是定义。

理解

如果只在源文件或头文件中定义的话,编译器一般认为inline函数在预处理时会替换,所以在编译的语义分析时不会吧把nline函数的标识符相关信息放到符号表里,就不会创建函数栈帧来调用inline函数。

所以inline函数的声明和定义的不分离其实就是因为,如果声明在源文件中,定义在头文件中,在预处理阶段头文件展开在源文件中后,同时因为它是内联函数,直接也被展开在程序中了,在之后的链接时声明虽然提供了这个内联函数的地址,但找不到这个内联函数的实体,所以链接错误。QAQ

嗯,建议将inline函数的定义直接放在头文件中,不用在源文件中声明。要使用包含头文件就行。

标签:函数,C++,语法,编译,编译器,内联,inline,展开
From: https://blog.csdn.net/2401_86702190/article/details/143701111

相关文章

  • 【C++】详细介绍模版进阶,细节满满
    目录一、非类型模版参数:1、介绍:2、使用:3、注意:4、应用二、模版特化(一)、概念(二)、函数模版特化1、步骤:2、举例:3、不建议使用函数模版特化(三)、类模版特化1.全特化:2、偏特化2.1、部分特化2.2、参数更进一步的限制2.3、注意:2.4、普通指针变量传递给const指针变量......
  • C++学习路线(求补充)
    研二女本硕211明年找工作看网上各种经验帖总结了个C++自学路线求各位大佬指正时间有点紧不知道学这些够不够学习内容:黑马C++基础语法书籍:C++primerplus1,2结束后开始刷代码随想录一天两道复习复习语法侯捷视频:侯捷-STL泛型编程(必看)侯捷-C++11新特性(必看)侯捷-......
  • JS初识_语法
    1.什么是JavaScript(简称JS)首先要了解前端以及Harmony生态中网站的组成部分(网站的三层结构)HTML表示了你的页面内有什么,组成页面的骨架(结构层)CSS表示了你的页面中每一个内容是什么样子的(样式层)JavaScript(简称js)表示了你的页面中每一个内容如何发生变化,有什么......
  • 打卡信奥刷题(221)用C++信奥P1740[普及组/提高] Diamond A&B(1)
    DiamondA&B(1)题目背景由于本题较难,将本题拆做两题,分别为diamondA以及diamondB。本题为DiamondA。题目描述教主上电视了!这个消息绝对是一个爆炸性的新闻。一经传开,大街上瞬间就没人了(都回家看电视去了),商店打烊,工厂停业。大家都把电视机的音量开到最大,教主的声音......
  • 【C++学习笔记一】变量与运算符
    目录一、C++输出数据1.1数据的分类1.2输出数据二、注释2.1 单行注释2.2 多行注释2.3VS中的快捷键三、变量3.1声明变量3.2变量的赋值3.3示例四、常量4.1宏常量4.2const修饰的变量4.3示例五、标识符的命名5.1C++命名规则5.2C++关键字六、数据输......
  • 代码静态测试工具Klocwork 2024.3新版发布:Validate平台改进编码标准CC++
    Klocwork2024.3为C/C++分析引擎和构建上传流程引入了新功能和性能改进。此版本还附带了增强的安全性和用户体验改进,包括用于SAML/OIDC身份验证的IDE插件中更好的用户身份验证工作流程。其他增强功能包括更广泛的编码标准覆盖范围以及改进的与Bazel构建系统的集成。Vali......
  • C++ 中环境变量获取,动态库环境变量的传递
    C++中环境变量获取,动态库环境变量的传递在实践中,考虑最好还是使用getenv()函数来取得相关的环境变量.C/C++获取系统环境变量,其实是很简单的.函数名:getenv功能:从环境中取字符串,获取环境变量的值头文件:stdlib.h用法:char*getenv(char*envvar);getenv()用来取......
  • 南沙C++信奥赛老师解一本通题 1385:团伙(group)
    ​【题目描述】在某城市里住着n个人,任何两个认识的人不是朋友就是敌人,而且满足:1、我朋友的朋友是我的朋友;2、我敌人的敌人是我的朋友;所有是朋友的人组成一个团伙。告诉你关于这n个人的m条信息,即某两个人是朋友,或者某两个人是敌人,请你编写一个程序,计算出这个城市最多可能有多......
  • C++求最小公倍数与最大公因数
    #大一小卡了咪的作业4题目:        设计两个函数MaxCommonDevisor(n,m) 和MinCommonMultiple(n,m),分别求两个数的最大公约数和最小公倍数。主函数调用上述两个函数,实现功能。    乍一看这个题其实比较麻烦,因为要同时满足两个数的要求(同时整除/分别整除),但实际......
  • C++-模块
    C++20引入了模块(Modules)的概念,这是一项重要的语言特性,旨在改进C++的编译速度和构建过程。模块提供了一种新的组织代码的方式,可以替代传统的头文件包含和预处理器。使用模块可以带来以下几个好处:更快的编译速度:传统的头文件包含方式在编译过程中需要进行大量的文件打开和文本处......