【发布时间】:2017-03-09 16:18:10
【问题描述】:
我正在为 FLASH 存储空间和 RAM 使用都受到关注的嵌入式系统编程。
根据 c11 标准第 6.2.4 节:
其标识符声明为没有链接且没有存储类说明符
static的对象具有自动存储持续时间 ...该对象的初始值是不确定的。如果 为对象指定了初始化,每次在块的执行中到达声明或复合文字时都会执行它
如果我理解正确,这意味着功能如下:
static void func(void){
const struct MyStruct j={5,6,7,8};
const char k[]="long string of some sort";
/*...some code...*/
}
j 和 k 需要在进入函数时(重新)初始化,这意味着 j 和 k 的存储位置必须放在 RAM 中,并从 FLASH 中的数据部分初始化像memcpy。这意味着它正在使用 RAM 和 FLASH 中的资源。与类似的东西相比:
static void func(void){
static const struct MyStruct j={5,6,7,8};
static const char k[]="long string of some sort";
/*...some code...*/
}
现在j 和k 只初始化一次,可以直接从FLASH 引用,而不是复制到RAM。
不将您的(大于寄存器大小)consts 声明为static 有什么好处吗?
基本上,我想知道我是否应该始终将我的consts 声明为static,或者是否有理由不这样做。
【问题讨论】:
-
C 标准中没有堆栈。如果在启用优化的情况下编译,您是否检查过机器代码?
-
添加
static真的是一个微优化。 -
@Olaf 我从 C 标准中添加了一些引号并清理了我的术语。我确实检查了(优化的)机器代码,确实没有
static修饰符,我的consts 正在通过调用memcpy 初始化到堆栈中,但是static他们只是直接从FLASH 引用。 -
@Rick:嗯,它可以在现代平台上生成相同的代码。但是,在 AVR 或 PIC 上会引起问题。这一切都取决于实际代码,这就是我们需要minimal reproducible example 和所有必要信息的原因。
-
@M.M:它不会造成伤害,但忽略它会导致大量的复制开销。在 PC 上这可能会很麻烦,但在 MCU 上可能会打乱整个时序。