私はCortexM3用のARMツールセットでKeil4を使用しています(それが重要な場合でも)。私はこの単純なコードを試しました:
class Base
{
public:
virtual ~Base() {}
};
class Derived : public Base
{
public:
int b;
virtual ~Derived() {}
};
ローカル(メイン内)でDerivedのインスタンスを作成すると、すべてが正常になります。デバッグは機能し、プログラムサイズは約300バイトです。
Derivedの静的またはグローバルインスタンスを作成すると、プログラムサイズが最大1000バイト増加し、BKPT命令でデバッグセッションが停止します。
これは、ヒープサイズがデフォルト値(ゼロ)に設定されているためです。ヒープを追加すると、デバッグが機能し始めました。
デストラクタを保護しますが、仮想ではない場合、同じ動作になります。通常のメソッドを仮想化することはしませんでした。
だから、私の質問は:この状況でコンパイラがヒープを必要とする理由は何ですか?
Vtabは静的に作成され(チェックしました)、グローバルオブジェクトも静的である必要があります。動的割り当てが必要ない場合、ヒープ割り当てコード(およびヒープ自体のスペース)にさらに700バイトを浪費するのはちょっとばかげています。
(警告を防ぐためにデストラクタを仮想化しました。)