当前位置: 首页 > 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.xdnf.cn/news/1077013.html

相关文章:

  • 若依中复制到剪贴板指令的使用v-clipboard
  • js严格模式和非严格模式
  • 【Python基础】13 知识拓展:CPU、GPU与NPU的区别和联系
  • 【科研绘图系列】基于R语言的复杂热图绘制教程:环境因素与染色体效应的可视化
  • SeaTunnel 社区月报(5-6 月):全新功能上线、Bug 大扫除、Merge 之星是谁?
  • 基于Spring Cloud微服务架构的API网关方案对比分析
  • 3.1.1.9 安全基线检查项目九:检查是否设置限制su命令用户组
  • [C#] WPF - 自定义样式(Slider篇)
  • 位运算经典题解
  • ELK日志分析系统(filebeat+logstash+elasticsearch+kibana)
  • Python 库 包 nltk (Natural Language Toolkit)
  • 视频断点续播全栈实现:基于HTML5前端与Spring Boot后端
  • 141.在 Vue 3 中使用 OpenLayers Link 交互:把地图中心点 / 缩放级别 / 旋转角度实时写进 URL,并同步解析显示
  • 【Maven 】 <resources> 配置中排除 fonts/** 目录无效,可能是由于以下原因及解决方案:
  • 计算机网络(二)应用层HTTP协议
  • (LangChain)RAG系统链路向量存储之Milvus(四)
  • 【1.4 漫画PostgreSQL高级数据库及国产数据库对比】
  • 【MyBatis保姆级教程下】万字XML进阶实战:配置指南与深度解析
  • 2025年6月28和29日复习和预习(C++)
  • JVM调优实战 Day 15:云原生环境下的JVM配置
  • SQLite与MySQL:嵌入式与客户端-服务器数据库的权衡
  • sqlmap学习ing(2.[第一章 web入门]SQL注入-2(报错,时间,布尔))
  • C++ 第四阶段 STL 容器 - 第九讲:详解 std::map 与 std::unordered_map —— 关联容器的深度解析
  • 解决安装UBUNTU20.04 提示尝试将SCSI(0,0,0),第一分区(sda)设备的一个vfat文件系统挂载到/boot/efi失败...问题
  • poi java设置字体样式
  • 数据结构day4——栈
  • WPF学习笔记(18)触发器Trigger
  • Cypher 是 Neo4j 专用的查询语言
  • 归因问答-有效归因实践
  • 笔记本电脑怎样投屏到客厅的大电视?怎样避免将电脑全部画面都投出去?