次のスニペットを考えてみましょう:
#include <array>
int main() {
using huge_type = std::array<char, 20*1024*1024>;
huge_type t;
}
通常、デフォルトのスタックサイズは通常20MB未満であるため、ほとんどのプラットフォームでクラッシュします。
次のコードを考えてみましょう:
#include <array>
#include <vector>
int main() {
using huge_type = std::array<char, 20*1024*1024>;
std::vector<huge_type> v(1);
}
意外にもクラッシュします!トレースバック(最近のlibstdc ++バージョンの1つを使用)はinclude/bits/stl_uninitialized.h
ファイルにつながり、ここに次の行が表示されます。
typedef typename iterator_traits<_ForwardIterator>::value_type _ValueType;
std::fill(__first, __last, _ValueType());
サイズ変更vector
コンストラクターは、要素をデフォルトで初期化する必要があります。これが実装方法です。明らかに、_ValueType()
一時的にスタックがクラッシュします。
問題は、それが適合実装であるかどうかです。はいの場合、それは実際には巨大な型のベクトルの使用がかなり制限されていることを意味しますね?
std::allocator
が使用されている場合のみです。