個々のコンテナクラス内に構造体のベクトルを格納したいという問題があります。C++での移動セマンティクスの活用
問題は、これらのベクトル用にこのコンテナを作成すると、ベクターがコピーされるためにリソースが浪費されることです。移動されません。一時的なリソースがcreate()
によって返されるのはなぜですか?main関数のローカル変数master_data
に転送されませんか?
サンプルコードを以下に示す(およびcoliru HEREで)されている:
ここ#include <stdio.h>
#include <vector>
#include <stdlib.h>
// Specific data struct
typedef struct DataA {
DataA(): a(rand()),
b(rand()) {}
int a,b;
} DataA;
// Another specific data struct
typedef struct DataB {
DataB(): c(rand()),
d(rand()) {}
int c,d;
} DataB;
// Container of all relevant data
typedef struct Master {
Master(const std::vector<DataA> &a, const std::vector<DataB> &b) : data_a(std::move(a)), data_b(std::move(b)) {}
Master(const Master &rhs) : data_a(std::move(rhs.data_a)), data_b(std::move(rhs.data_b)) {}
std::vector<DataA> data_a;
std::vector<DataB> data_b;
} Master;
Master create() {
std::vector<DataA> data_a(10);
std::vector<DataB> data_b(10);
printf("data_a address inside create() : %p\n", (void*)data_a.data());
printf("data_b address inside create() : %p\n", (void*)data_b.data());
return {data_a, data_b};
}
int main()
{
Master master_data(create());
printf("data_a address outside create() : %p\n", (void*)master_data.data_a.data());
printf("data_b address outside create() : %p\n", (void*)master_data.data_b.data());
return 0;
}
コンセプトは "と呼ばれていますmove ** semantics ** "、" move schematics "ではありません。 –
__Paste__あなたが尋ねたいコードは、リンクしないでください。また、[mcve]と明確な質問文を提供してください。 "これは機能しますか?"明確な質問文ではない、「x行はYの時間複雑さを持っていますか?です。 –
@PasserBy:質問を改善するために編集しました。 – ELEC