我正在使用-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__
)?
答案 0 :(得分:5)
如果您有constexpr
构造函数,并且创建的对象是const
,则GCC会自动将该对象放入.rodata
部分。