c++ - 使用 GCC 在静态内存中分配 C++ 类

标签 c++ gcc heap-memory

我想在静态内存中分配大量类,而不是将堆用于使用 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/

相关文章:

c++ - 如何判断谁发送了 ON_WM_SHOWWINDOW 消息 mfc

c - 指针处的值仅在使用时才会更新

java - java中数组初始化时的栈和堆内存

c++ - cpp 代码中的堆泄漏

c++ - 高负载服务器的脚本编程策略

c++ - 在类中初始化 boost::multi_array

gcc - 使用不同的 gcc 版本构建 boost

java - 字符串对象和堆

c++ - gcc 编译器报告类的大小=零

c++ - 错误: 'ALIGN' undeclared (first use in this function) with ALIGN defined into macro