我正在将 Keil 4 与 ARM 工具集一起用于 Cortex M3(如果这很重要的话)。我尝试了这个简单的代码:
class Base
{
public:
virtual ~Base() {}
};
class Derived : public Base
{
public:
int b;
virtual ~Derived() {}
};
如果我在本地(在 main 内部)创建 Derived 的实例,一切都很好:调试工作正常,程序大小约为 300 字节。
如果我创建 Derived 的静态或全局实例,程序大小会增加到 1000 字节,并且调试会话会在 BKPT 指令上停止。
我整理出这是因为堆大小设置为其默认值(零)。当我添加一些堆时,调试开始工作。
使析构函数受保护但非虚拟会导致相同的行为。使通常的方法 virtual 没有。
所以,我的问题是:为什么编译器在这种情况下需要堆?
Vtab 是静态创建的(我检查过),全局对象也应该是静态的。当我不需要动态分配时,再浪费 700 个字节用于堆分配代码(以及堆本身的空间)有点愚蠢。
(我将析构函数设为虚拟以防止出现警告。)