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

Thu*_*fir 6 c++ embedded gcc arm

我在CORTEX-M4上使用GCC 6.3.1 for ARM -O2.

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

class Test
{
  public:
    void Print(void) const
    {
      printf("Test");
    }
};
const static Test test;
Run Code Online (Sandbox Code Playgroud)

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

printf("Address: %X", &test);
Run Code Online (Sandbox Code Playgroud)

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

.bss._ZL4test 0x20005308 0x1
Run Code Online (Sandbox Code Playgroud)

保留一个字节是合乎逻辑的,因为每个被寻址的对象必须有一个地址.另一方面,我认为对于像这样简单的东西,编译器会在.text段中保留不占用任何RAM空间的空间.

现在,我可以.text通过将定义更改为以下内容来强制对象进入细分:

const static Test test __attribute__ ((section (".text")));
Run Code Online (Sandbox Code Playgroud)

但随后它总是被迫进入那一部分.这意味着当有人插入非const成员变量时,该对象将不再起作用.

有没有办法告诉g ++将这些对象的地址(没有任何成员变量)放入FLASH而不是RAM(不使用__attribute__)?

gez*_*eza 5

如果你有一个constexpr构造函数,并且创建的对象是const,那么GCC会.rodata自动将对象放入该部分.