私は、を持っていstd::vector<SomeType>
ますSomeType
が、はstruct
さまざまなテンプレートパラメータからインスタンス化されています。
最終的に私の特定のケースでは、それは大きな構造(約1MB)であることが判明しました。このような構造をスタックに割り当てる(つまり、このタイプの自動変数を使用する)と、すぐにスタックオーバーフローが発生します。ただしstd::vector
、メモリはヒープに割り当てられるため、問題はありません。
驚いたことに、これには問題があります。具体的には、問題は初期化にあります。私は次のことをします:
std::vector<SomeType> myVec;
// ...
myVec.resize(N);
for (size_t i = 0; i < N; i++)
{
SomeType& x = myVec[i];
// initialize it
}
でスタックオーバーフロー例外が発生しmyVec.resize()
ます。resize()
デバッガーを使用して内部に入ると、が大きくresize()
なる場合はvector
、メモリを割り当てるだけでなく、「デフォルト値」によって新しい要素を初期化することもわかりました。
「デフォルト値」は、指定されたタイプの自動変数を作成し、デフォルトの(つまり空の)コンストラクターを使用して、それに新しい要素を割り当てることによって取得されます。
これを克服する方法があるのだろうか。std::vector
つまり、新しい要素を初期化しないように指示します。しかし、不要なコードを生成せずにこれを実現したいと思います。
vector
(スマート/共有/スコープ/一意の)ポインターを使用して入力することを考えることができます。または、代わりに使用しますpush_back
が、新しい各要素はヒープに割り当てられます。しかし、これは避けられないことですが、余分なコードが必要です。これは正当化されません。
必要なことを達成する方法はありますか?一方:
- まだ使用しています
std::vector<SomeType>
- 冗長なヒープ割り当てはありません
前もって感謝します