当前位置: 首页 > article >正文

C++ inline的使用和含义详解

用inline修饰的函数叫做内联函数,编译时C++编译器会在调用的地方展开内联函数,这样调用内

联函数就需要建立栈帧了,就可以提高效率。

#include<iostream>
using namespace std;
inline int Add(int x, int y)
{
int ret = x + y;
ret += 1;
ret += 1;
ret += 1;
return ret;
}
int main()
{
// 可以通过汇编观察程序是否展开
// 有call Add语句就是没有展开,没有就是展开了
int ret = Add(1, 2);
cout << Add(1, 2) * 5 << endl;
return 0;
}

通过汇编观察程序发现没有展开

原因是在于我们使用的是debug版本的

为了方便调试,便不进行展开

如此图

没有call Add语句

因此进行了展开,从而避免了调用,提高了效率 

 

inline对于编译器而言只是一个建议,也就是说,你加了inline编译器也可以选择在调用的地方不展

开,不同编译器关于inline什么情况展开各不相同,因为C++标准没有规定这个。

inline适用于频繁调用的短小函数,对于递归函数,代码相对多一些的函数,加上inline也会被编译

器忽略。

C语言实现宏函数也会在预处理时替换展开,但是宏函数实现很复杂很容易出错的,且不方便调

试,C++设计了inline目的就是替代C的宏函数。

vs编译器 debug版本下面默认是不展开inline的,这样方便调试,debug版本想展开需要设置一下

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

因为inline被展开,就没有函数地址,链接时会出现报错。

当然

展开也具有缺陷性

如下图所示

展开有概率使内存变大

如果一个游戏内存过大,想想也产生了抗拒的心里吧 


http://www.kler.cn/a/505819.html

相关文章:

  • 【Vim Masterclass 笔记14】S07L29 + L30:练习课08 —— Vim 文本对象同步练习(含点评课内容)
  • Realsense相机驱动安装及其ROS通讯配置——机器人抓取系统基础系列(四)
  • Cosmos:英伟达发布世界基础模型,为机器人及自动驾驶开发加速!
  • 1月13日学习
  • Navicat Premium 原生支持阿里云 PolarDB 数据库
  • C#中的ref struct
  • JavaScript系列(28)--模块化开发详解
  • ansible之playbook实战
  • OpenGL —— 基于Qt的视频播放器 - ffmpeg硬解码,QOpenGL渲染yuv420p或nv12视频(附源码)
  • 文章复现—面向配电网韧性提升的移动储能预布局与动态调度策略
  • Excel批量写sql
  • RPC实现原理,怎么跟调用本地一样
  • vue3使用vue-native-websocket-vue3通讯
  • 省级-农业科技创新(农业科技专利)数据(2010-2022年)-社科数据
  • 30分钟内搭建一个全能轻量级springboot 3.4 + 脚手架 <5> 5分钟集成好caffeine并使用注解操作缓存
  • 力扣 20. 有效的括号
  • Java Python:从简单案例理解 HTTP 服务开发与调用!
  • 算法15、双指针(归并排序两种做法)
  • 视频本地化的特点
  • 本地视频进度加入笔记+根据进度快速锁定视频位置
  • LeetCode 每日一题 2025/1/6-2025/1/12
  • [Qt] 窗口 | QDialog | 常用内置对话框
  • 数据仓库的复用性:设计和构建一个高复用性的数仓
  • 软考信安20~数据库系统安全
  • 数据通过canal 同步es,存在延迟问题,解决方案
  • Web前端------HTML多媒体标签之音频和视频标签