0

いくつかのコンパイラは C++ の拡張機能をサポートしており、スタックにメモリを動的に割り当てることができます。たとえば、VLA と同様にg++サポートします。alloca()これらの拡張機能にはすべて、動的に割り当てられたメモリが呼び出し元の関数のスコープの最後で "割り当て解除" されるという注意事項があります。(編集:明確にするために、「割り当て解除」を引用符で囲みます。実際に起こっているのは、コンパイラがスタックポインターをデクリメント/インクリメントしているため、alloca()コンパイラのサポートが必要な理由です。)これはalloca()、クラスのコンストラクター内で割り当てられたメモリが割り当て解除されることを意味します。コンストラクターが戻るとすぐに。

この制限は、コンストラクターが割り当てるメモリの量を決定するためにいくつかの重要な手順を実行するクラスで対処するのが非常に困難になります。クラスのユーザーは、クラスの構築元の関数にメモリを割り当てる必要があります。これにより、おそらく公開すべきではない内部構造が公開されます。さらに、コードalloca()や VLA を使用できるようにするための回避策をコードに入れることは、一般的に不便です。

alloca()、VLA、またはその他の言語拡張機能を使用して、クラス内でメモリを割り当て、クラス スコープを持つことができるように、この制限を回避する方法を考えてもらえますか?

4

1 に答える 1

5

いいえ、それは不可能です。クラスは関数ローカル メモリを割り当てることができません。その平野は意味がありません。

ただし、適切なカスタム アロケータ (メモリ アリーナなど) を使用すると、非常に高速なヒープ割り当てを実現できます。覚えておく必要があるnewのは、これがメモリ割り当ての核弾頭であることです。これは、任意の割り当てサイズと、任意の割り当て/割り当て解除パターンをサポートする必要があります。より具体的なものは、スタックに割り当てられたメモリと非常に競合するところまで、非常に高速に動作する可能性があります。Visual Studio 2010 では、よりも高速に実行することさえできましたalloca

于 2012-07-31T00:24:37.190 に答える