私の解決策は、これらの制約を考慮に入れています(OPとさまざまな回答へのいくつかのコメントによって暗示されています):
- STL は使用できません。と
- (ヒープではなく) スタック メモリを使用します。
また、他の人が言及したアライメントの問題も考慮されており、OP に C++11 のタグが付けられているため、C++11 を使用できます。
最初にFooそれを初期化しないためのストレージを導入します。
union FooStorage {
Foo data;
FooStorage() {
}
template <typename... Args>
void init(Args&&... args) {
new (&data) Foo{static_cast<Args&&>(args)...};
}
~FooStorage() {
data.~Foo();
}
};
コンストラクタは初期化されませんdataが、デストラクタが破棄することに注意してください。破棄する前に( を使用して)初期化する必要があります。(OPから、それが起こると思いますが、この危険性を指摘する必要があります。)datainit()
とを使用した初期化は同等ではない{ ... }ことに注意してください。のコンストラクター( ... )に基づいて決定する必要があります。Foo
Fooこの方法で 10 秒間スタック メモリを割り当てます
FooStorage buffer[10];
i-thを初期化するにはFoo:
buffer[i].init(/* constructor arguments */);
i-thを使用するにはFoo、たとえば、それの method を呼び出しますdo_something。
buffer[i].data.do_something();
これが基本的な考え方です。にできる改善点はたくさんありますFooStorage。