为什么gcc不创建新变量?

问题描述 投票:0回答:2

我有这样的代码:

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++ 标准中有所描述,或者它是编译器优化,并且在不同的编译器中可能有所不同,我会感到很受伤?

c++ c++11 gcc g++ compiler-optimization
2个回答
0
投票

gcc 链接器 (ld) 在目标代码的“.data”部分分配

const char []
文字。默认情况下,对于哈佛架构(STM32等),“.data”部分是Flash存储器的一部分。


0
投票

该标准不涉及 RAM 或闪存。它的实现决定了数据的存储位置和方式。

但是,标准确实规定 const 对象无法修改,因此我希望有一个明智的实现将

static const
对象存储在只读内存中(如果这是最有效的)。另一方面,非常量对象通常必须存在于可写内存中。

[dcl.type.cv]/4:

任何在其生命周期内修改 const 对象的尝试都会导致未定义的行为。

© www.soinside.com 2019 - 2024. All rights reserved.