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

【C++】inline的作用

一、inline的作用

1.1函数内联

  • 作用​:建议编译器将函数调用替换为函数体代码,减少函数调用的开销(压栈/跳转)。
  • ​注意​:这只是对编译器的建议,编译器可能忽略(如函数体过大或递归)。

1.2 解决链接问题

允许在多个编译单元(.cpp 文件)中重复定义相同的函数(通常用于头文件中的函数定义)。

// utils.h
inline void print() {std::cout << "Hello";
}

​原理​:链接器会合并所有编译单元中的 inline 函数定义,避免重复定义错误。

1.3 ​类内定义的成员函数​(隐式内联)

class Vector {
public:float x, y;// 隐式 inlinefloat length() const {return std::sqrt(x * x + y * y);}
};

1.4 C++17内联

解决全局变量/静态变量在头文件中的重复定义问题。

inline int globalVar = 42; // 头文件中定义全局变量

关键注意事项​

编译器自主权​:

  • inline 只是建议,编译器可能拒绝内联(如函数包含循环、递归或虚函数)。
    可通过编译器选项强制内联(如GCC的__attribute__((always_inline)))。

​适合场景​:

- 小函数​:适合内联(如getter/setter)。
- 频繁调用​:减少调用开销。
- 头文件库代码​:避免链接错误。

不适合场景​:

- 大函数​:可能导致代码膨胀(二进制体积增大)。
- ​虚函数​:通常无法内联(需运行时确定调用)。
- 递归函数​:编译器通常忽略内联建议。

定义必须在调用处可见​:

  • 内联函数的 ​定义必须出现在每个调用它的编译单元中,通常放在头文件中,否则编译器无法展开代码-
  • 普通函数可以声明在头文件、定义在.cpp文件。

链接与ODR规则​

  • inline 允许函数在多个编译单元中重复定义,但所有定义必须完全相同,否则未定义行为。
  • 非inline函数多次定义会导致链接错误。

​调试影响​:

内联函数在调试时可能难以追踪(无调用栈),编译时关闭优化(如-O0)可缓解。

http://www.lqws.cn/news/601687.html

相关文章:

  • InnoDB数据页
  • 61、【OS】【Nuttx】【构建】向量表
  • OpenCv基础(C++)
  • 6.Docker部署ES+kibana
  • 无人机目标检测数据集介绍-14,751张图片 无人机检测 航拍图像
  • 路科V0—基础(2)设计特性与接口
  • 【第二章:机器学习与神经网络概述】04.回归算法理论与实践 -(3)决策树回归模型(Decision Tree Regression)
  • 融智学定律3:流动创造价值仅当跨域协同
  • Arduino LED立方体3D公告板制作指南
  • uniapp+vue3 中使用echart 以及echart文件过大需要分包的记录
  • imx6ull芯片中断机制6.24-6.25
  • Redis为什么是单线程
  • UE5.6 官方文档笔记 [1]——虚幻编辑器界面
  • 6.2 实现文档加载和切分和简易向量数据库的功能
  • browser-tools-mcp + excel-mcp-server + cursor 实现读取网页信息自动写入Excel
  • SQL Server 进阶:递归 CTE+CASE WHEN 实现复杂树形统计(第二课)
  • 读Vista
  • Python实例题:基于 Python 的简单爬虫与数据可视化
  • Hibernate中save与saveOrUpdate的差异解析
  • HDMI2.1 FRL流控 概览
  • Linux驱动学习day13(同步与互斥)
  • AI的未来:人类会被取代,还是变得更强大?
  • HTTPS安全传输时采用的顶级阳谋
  • 【Maven 】 <resources> 配置中排除 fonts/** 目录无效,可能是由于以下原因及解决方案:
  • 编写rosbag脚本记录雷达与imu数据包
  • 学习经验分享【41】YOLOv13:基于超图增强自适应视觉感知的实时目标检测
  • day41简单CNN
  • 【Web3.0】Web1.0、Web2.0和Web3.0有哪些区别联系?
  • MySQL 8.4 备份与恢复完全指南
  • win11,visual studio 2022,配置dcmtk,opencv