私の通常使用するC++コンパイラは可変長配列(たとえば、ランタイムサイズに応じた配列)を許可するので、可変サイズのstd::array
のようなものがあるのだろうか?もちろん、std::vector
は可変サイズですが、ヒープに割り当てられ、必要に応じて再割り当てされます。
実行時に定義されたサイズのスタック割り当て配列が好きです。これを特徴とするstd
-テンプレートはありますか?たぶん、固定の最大サイズでstd::vector
を使用しますか?
実行時の固定サイズの配列をC++に導入するために現在取り組んでいる提案は、2つあります。
自動保存期間のあるランタイムサイズの配列 。これにより、ランタイムサイズの配列が言語機能になります(C11のように)。だからあなたはすることができます:
void foo(std::size_t size) {
int arr[size];
}
C++動的配列 。これにより、新しいコンテナがライブラリに追加されます。std::dynarray
、これは建設時に固定サイズが与えられます。可能な場合はスタックに割り当てられるように最適化することを目的としています。
void foo(std::size_t size) {
std::dynarray<int> arr(size);
}
これらは両方とも、C++ 14と一緒にリリースされるArrayExtensions TechnicalSpecificationの一部として取り組んでいます。
ダニエルがコメントで述べたように、std::array
のサイズはテンプレートパラメータとして指定されているため、実行時に設定することはできません。
ただし、コンストラクターパラメーターに最小容量を渡すことでstd::vector
を作成できます。
#include <vector>
int main(int argc, char * argv[])
{
std::vector<int> a;
a.reserve(5);
std::cout << a.capacity() << "\n";
std::cout << a.size();
getchar();
}
だが。 それでも、ベクターの内容はスタックではなくヒープに保存されます。問題は、コンパイラが実行前に関数に割り当てる必要のあるスペースの量を認識している必要があるため、可変長データをスタックに格納できないことです。