我有这样的代码:
static const char kFmt[] = "some string: - %s";
char buf[sizeof(kFmt) + 10];
snprintf(buf, sizeof(buf), kFmt, "string");
看起来arm gcc 6.3.0不会在RAM中创建附加字符数组
kFmt
,只是将指向字符串文字(在我的情况下存储在闪存中)的指针传递给snprintf
。但是,如果我删除 const 并拥有 static char kFmt[]
,我可以看到在 RAM 中创建了额外的数组,然后传递给 snprintf
。这不是问题,但如果这种行为在 C++ 标准中有所描述,或者它是编译器优化,并且在不同的编译器中可能有所不同,我会感到很受伤?
gcc 链接器 (ld) 在目标代码的“.data”部分分配
const char []
文字。默认情况下,对于哈佛架构(STM32等),“.data”部分是Flash存储器的一部分。
该标准不涉及 RAM 或闪存。它的实现决定了数据的存储位置和方式。
但是,标准确实规定 const 对象无法修改,因此我希望有一个明智的实现将
static const
对象存储在只读内存中(如果这是最有效的)。另一方面,非常量对象通常必须存在于可写内存中。
任何在其生命周期内修改 const 对象的尝试都会导致未定义的行为。