You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么Arduino中类对象指针比普通对象占SRAM更少,对应内存位于哪?

Arduino类对象与动态指针的内存差异解答

为什么指针数组写法显示的SRAM占用更低

你看到的内存占用差异本质是Arduino IDE的SRAM统计规则导致的,并非动态创建对象真的大幅降低了内存消耗:

  • AVR架构的Arduino SRAM被逻辑划分为三部分:静态存储区、堆、栈。其中静态存储区的大小在编译期就能完全确定,存放全局变量、静态变量,这部分占用量会直接显示在IDE的编译输出里。
  • 你最初定义3个全局Adafruit_VL53L0X对象时,每个对象的完整内存都属于静态存储区,编译时3个对象的总大小全部被计入已用SRAM,所以显示占比达80%。对应代码的静态分配内存就是3个完整类对象的大小:
Adafruit_VL53L0X lox0 = Adafruit_VL53L0X();
Adafruit_VL53L0X lox1 = Adafruit_VL53L0X();
Adafruit_VL53L0X lox2 = Adafruit_VL53L0X();
  • 改用指针数组的写法时,被计入静态存储区的只有3个指针的大小(ATmega32U4架构下每个指针占2字节,总共仅6字节),所以IDE统计的已用SRAM大幅降低到30%。对应代码的静态分配内存只有指针数组本身:
Adafruit_VL53L0X *lox_array[3] = {new Adafruit_VL53L0X(), new Adafruit_VL53L0X(), new Adafruit_VL53L0X()};

注意:3个Adafruit_VL53L0X对象的实际内存占用并没有消失,只是没有被IDE的编译期统计捕获而已。

new创建的对象所属存储区域

Arduino(AVR架构)的new关键字底层封装了malloc,动态申请的内存全部位于SRAM的堆区域,和静态存储区、栈属于同一块物理SRAM,只是逻辑划分的位置不同。如果你的程序在运行时频繁申请、释放动态内存,还可能产生堆碎片,最终导致内存申请失败。

内容的提问来源于stack exchange,提问作者Sgt Shepard

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 11:36:01