news 2026/4/17 8:19:17

内联函数(inline)的内存原理 --- 拓展普通函数和宏的对比

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
内联函数(inline)的内存原理 --- 拓展普通函数和宏的对比

1,普通函数调用流程(栈的使用)

假设有一个普通函数:

void Print() { int x = 10; std::cout << x; } int main() { Print(); }

调用过程(CPU 和栈视角):

  1. 调用Print()
    • CPU 执行call Print
    • 当前栈帧(main 的栈)保存返回地址
    • CPU 跳到Print的代码段执行
  2. 创建Print的栈帧
    • 栈顶分配局部变量空间(int x = 10
    • 保存必要的寄存器、返回地址等
  3. 函数体执行
    • 打印 x
  4. 函数返回
    • 弹出栈帧,恢复寄存器
    • 用栈中保存的返回地址跳回 main
  5. ✅ 栈的特点:每个函数调用都会分配自己的栈帧

  1. 函数逻辑(代码)→ 固定在代码段
  2. 调用时的栈帧→ 为函数的局部变量、返回地址、寄存器开辟临时空间
  3. 函数执行逻辑在栈上运行,结束后释放空间
  4. 内联函数→ 减少栈帧创建,局部变量在调用函数栈帧
  5. 宏定义→ 文本替换,直接在调用点执行,也在调用函数栈帧

2, 内联函数的调用流程

假设:

inline void Print() { int x = 10; std::cout << x; } int main() { Print(); }

调用过程:

  1. 调用点直接展开函数体(编译器把函数内容复制到调用点):

int main() {

int x = 10;
std::cout << x;
}

  1. 栈的变化
    • 没有新的栈帧分配
    • 变量x直接在 main 的栈帧上分配
    • 不用压返回地址,不用跳转
  2. CPU 执行顺序
    • 就像你在 main 里直接写了int x = 10; std::cout << x;

✅ 栈的特点:

  • 没有独立栈帧
  • 局部变量在调用函数的栈帧里
  • 减少了压栈、跳转、返回的开销

3,宏定义(#define)和内联函数的表面相似

#define SQUARE(x) ((x)*(x))
  • 使用时:

int a = 5;
int b = SQUARE(a); // 编译器预处理时替换成 ((a)*(a))

✅ 表面相似点:

  • 都在调用处展开,没有函数调用开销
  • 适合小功能,频繁调用也不会压栈

4,宏定义的本质(预处理阶段)

  • 宏在编译前就被展开预处理器阶段
  • 编译器根本没有“看到函数”,它只是文本替换

b = SQUARE(a); // 预处理后
b = ((a)*(a));

  • 内存上根本没有函数体
  • 不会有函数调用,也没有inline之类的优化
  • 问题:没有类型检查、可能有副作用

总结对比

特性普通函数内联函数
栈帧独立栈帧不分配独立栈帧,局部变量在调用点栈帧里
返回地址压栈 + ret无需压栈
CPU 跳转call → 执行 → ret直接顺序执行展开代码
局部变量在函数栈帧在调用函数栈帧

这是图片对比,外加宏。直接全部搞懂

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/17 8:15:56

腾讯开源 | 蒸馏结合可学习缓存:腾讯混元视频生成加速新探索

来自腾讯混元的全新AIGC视频生成加速方案--(Distillation-CompatibleLearnableFeatureCaching)DisCa正式开源&#xff0c;作为学界和业界首次对基于可学习的特征缓存技术进一步加速蒸馏后少步模型的这一方向的尝试&#xff0c;该工作现已被CVPR2026接收。TL;DR速览:DisCa主要聚…

作者头像 李华
网站建设 2026/4/17 8:12:13

3个步骤解锁VMware的macOS支持:开源工具Unlocker完整指南

3个步骤解锁VMware的macOS支持&#xff1a;开源工具Unlocker完整指南 【免费下载链接】unlocker VMware Workstation macOS 项目地址: https://gitcode.com/gh_mirrors/unloc/unlocker 在虚拟化技术日益成熟的今天&#xff0c;许多开发者希望在Windows或Linux平台上运行…

作者头像 李华
网站建设 2026/4/17 8:12:06

效率翻倍|程序员 / 产品必学的 AI 绘图技巧

点击卡片“大数据实战演练”&#xff0c;选择“设为星标”或“置顶”回复“资料”可领取独家整理的大数据学习资料&#xff01;回复“Ambari知识库”可领取独家整理的Ambari学习资料&#xff01;回复“deepseek”可领取干货资料以及知识库&#xff01;一、前言今天发现了一个宝…

作者头像 李华
网站建设 2026/4/17 8:09:59

S32K144的FTM模块实战:用PWM驱动舵机与呼吸灯(附S32DS工程)

S32K144的FTM模块实战&#xff1a;PWM驱动舵机与呼吸灯全流程解析 1. 硬件准备与环境搭建 拿到S32K144开发板的第一件事&#xff0c;就是检查硬件连接和搭建开发环境。我习惯在开始任何嵌入式项目前&#xff0c;先列一个硬件清单&#xff1a; 核心设备&#xff1a; S32K144EV…

作者头像 李华