const类实例的C ++内存地址

时间:2018-07-30 12:54:54

标签: c++ gcc arm embedded

我正在使用-O2在CORTEX-M4上将GCC 6.3.1用于ARM。

如果我有一个像这样的简单类实例:

class Test
{
  public:
    void Print(void) const
    {
      printf("Test");
    }
};
const static Test test;

在某处我引用该对象的地址,例如:

printf("Address: %X", &test);

然后我可以在映射文件中看到编译器在.bss段中为该地址保留一个字节:

.bss._ZL4test 0x20005308 0x1

保留一个字节是逻辑的,因为要寻址的每个对象都必须具有一个地址。另一方面,我假设对于像这样的简单程序,编译器将在.text段中保留空间,而不会占用任何RAM空间。

现在,通过将定义更改为:

,我可以将对象强制进入.text段中。
const static Test test __attribute__ ((section (".text")));

但是总是将其强制进入该段。这意味着当有人插入非const成员变量时,该对象将不再起作用。

是否有任何方法告诉g ++将此类对象(没有任何成员变量)的地址放入闪存而不是RAM(不使用__attribute__)?

1 个答案:

答案 0 :(得分:5)

如果您有constexpr构造函数,并且创建的对象是const,则GCC会自动将该对象放入.rodata部分。