我刚刚在LinkedIn上观看了这个关于Lookup表的视频,它提到如果没有'const'限定符,数组将被分配到RAM中并且初始分配在启动期间发生,整个表将被存储两次 - 在RAM和ROM都有。
有人可以更详细地向我解释一下吗?为什么会存储两次?这是否意味着所有没有'const'的变量/数组都会被存储两次?切换案例是否比没有const的查找表更好?
提前致谢。
微控制器通常(除了无闪存的)闪存比RAM更多。将常量数据放入RAM中将是一种浪费。
当您使用const
关键字时,大多数工具链将数据放在.rodata部分中,该部分位于只读存储器 - FLASH中。一些uC类型(例如AVR)需要使用特殊机制来访问这些数据,对于大多数现代类型,几乎没有区别(快速uC需要使用等待状态减慢读写操作,因为FLASH比SRAM慢)
您还可以使用属性和编译指示强制将static const
自动变量放入ROM中
(gcc)static const char __attribute__((section(".rodata"))) x;
(章节可能有不同的名称 - 请查看您的工具链文档)
但它只适用于全局变量 - 大多数实现将自动const
变量放在位于RAM中的堆栈上
static const
也可以仅存储在ROM中。但是几年前我和其中一个uC gcc分支机构的经历很糟糕。确保 - 检查工具链对此变量的作用。
因此const
对于查找表不是必需的,但保存(通常)非常有限的资源(SRAM)是合乎逻辑的。