web-dev-qa-db-ja.com

可変長std :: arrayのような

私の通常使用するC++コンパイラは可変長配列(たとえば、ランタイムサイズに応じた配列)を許可するので、可変サイズのstd::arrayのようなものがあるのだろうか?もちろん、std::vectorは可変サイズですが、ヒープに割り当てられ、必要に応じて再割り当てされます。

実行時に定義されたサイズのスタック割り当て配列が好きです。これを特徴とするstd-テンプレートはありますか?たぶん、固定の最大サイズでstd::vectorを使用しますか?

17
dronus

実行時の固定サイズの配列を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の一部として取り組んでいます。

15

ダニエルがコメントで述べたように、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();
}

だが。 それでも、ベクターの内容はスタックではなくヒープに保存されます。問題は、コンパイラが実行前に関数に割り当てる必要のあるスペースの量を認識している必要があるため、可変長データをスタックに格納できないことです。

7
Spook