我想在静态内存中分配大量类,而不是将堆用于使用 C++ 的嵌入式项目。当前,当我们在专门用于静态分配类的单独 CPP 文件中对类执行以下操作时:
Config cfg(spi);
据我所知,这是在堆上分配的。单步执行汇编代码,我看到最终调用了 malloc。堆栈跟踪如下所示:
malloc()
__register_exitproc()
__static_initialization_and_destruction_0()
_GLOBAL__sub_I_periodic()
__libc_init_array
<reset vector>
配置类如下所示:
class Config
{
public:
Config(SPIDriver &spi);
virtual ~Config();
private:
SPIDriver *_spi;
}
然后实现看起来像这样:
Config::Config(SPIDriver &spi)
: _spi(&spi) {}
Config::~Config() {_spi = NULL;}
有什么方法可以强制 GCC 将它放在静态内存中而不是堆上?提前致谢!
最佳答案
我终于找到了我的问题。 Zack 是对的,正在调用 __register_exitproc 并将析构函数注册到链表中。这就是为什么要调用malloc,所以给链表分配空间。我们的程序运行在裸机 ARM(Cortex M4)上。所以这些类永远不会被破坏,因为当我们断电时电源会丢失。幸运的是 __register_exitproc 是一个弱函数,所以我创建了这个函数的另一个版本什么也不做。动态内存分配没有任何问题,它是有效的,但由于某种原因在 __register_exitproc 中,它试图从具有奇数(字面上)地址的内存位置将 32 位值加载到 ARM GPR 中。这会导致抛出硬故障异常。通过覆盖 __register_exirproc,我们可以防止发生此异常。另外,我们摆脱了系统启动时的动态内存分配。
希望这对其他人有帮助。一如既往,感谢或帮助!!!
关于c++ - 使用 GCC 在静态内存中分配 C++ 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14588091/