std::array
これは、スタック メモリとヒープ メモリの相互作用、およびstd::vector
クラスを介してスタックからヒープに移動する特定のケースに関する質問です。
原則std::array<T>
として、最初の要素へのポインターと、配列のサイズに関するコンパイル時の情報を加えたものと見なすことができます。std::vector<T>
その事実を考慮して、ポインターをコピーするだけarray
での内容をに移動しようとするコンストラクターを持つことは可能でしょうか。vector
ユースケースは、std::array<double, >
std::array<double, 20> fun(){...};
std::vector
しかし、要素ごとにコピーする必要なく、後でそれを a に割り当てることにしました。
std::vector<double> v = fun(); // not working code
今、やらなければならないこと
std::array<double, 20> tmp = fun();
std::vector<double> v(tmp.begin(), tmp.end());
実際には、これが可能であれば不要な冗長な作業を行いますstd::vector<double> v(std::move(tmp)); \\ not working code
。
std::vector
とのメモリ配置はstd::array
同じなので、 と の障害ではありません。
主な障害は、std::array
要素がスタックにあり、std::vector
要素がヒープにある可能性があることを理解しています。ムーブ コンストラクターを記述してもstd::vector
、スタックからのメモリが取り返しのつかないほど破壊されることは明らかです。
したがって、この質問は次のようにも読めると思います。
メモリをスタックからヒープに移動する方法はありますか (それが何を意味するにせよ)、それを移動コンストラクタと組み合わせることができるかどうかは?
またはstd::vector
、原則として移動コンストラクターをstd::array
?
MWE:
#include<array>
#include<vector>
std::array<double, 20> fun(){return {};} // don't change this function
int main(){
std::array<double, 20> arr = fun(); // ok
std::vector<double> v(arr.begin(), arr.end()); // ok, but copies and the allocation is duplicated
std::vector<double> v2 = fun(); // not working, but the idea is that the work is not duplicated
}