当前位置: 首页 > 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.dtcms.com/a/264067.html

相关文章:

  • 齿轮的齿厚极限偏差如何确定?一起学习一下
  • Vue3——富文本
  • 地震灾害的模拟
  • win11,visual studio 2022,配置dcmtk,opencv
  • vue vxe-table 自适应列宽,根据内容自适应宽度的2种使用方式
  • MySQL非阻塞创建索引的方法
  • golang generic 2022-04-13
  • Linux 系统重启 reboot与重置reset深度解析
  • 【读代码】百度开源大模型:ERNIE项目解析
  • 软件测试复习之单元测试
  • C#系统学习第六章——循环语句
  • 【PDF-XSS攻击】springboot项目-上传文件-解决PDF文件XSS攻击
  • 创始人IP商业闭环构建:从定位到二次转化的全流程|创客匠人
  • 【文件解析】json.load(fp)
  • 数据结构——单链表反转、相邻节点最大值、有序链表合并
  • 【javaAI】SpringAI快速入门
  • Kafka日常运维命令总结
  • 第4课:Flask请求与响应对象深度解析
  • 【Python】Flask网页
  • React Native 0.79.4 中 [RCTView setColor:] 崩溃问题完整解决方案
  • JavaEE初阶第六期:解锁多线程,从 “单车道” 到 “高速公路” 的编程升级(四)
  • 无法将“pytest”项识别为 cmdlet、函数、脚本文件或可运行程序的名称
  • NLP——RNN变体LSTM和GRU
  • 【Linux】进程
  • ELK日志分析系统(filebeat+logstash+elasticsearch+kibana)
  • Pycharm安装第三方库
  • 【实战】 容器中Spring boot项目 Graphics2D 画图中文乱码解决方案
  • 脑机新手指南(二十一)基于 Brainstorm 的 MEG/EEG 数据分析(上篇)
  • ChatGPT + GitHub Copilot + Cursor 实战提升编程效率
  • Oracle 常用函数