推奨されるコーディング手法について質問があります。モデル分析用のツールがあり、大量のデータを渡す必要がある場合があります (ファクトリ クラスから複数の異種チャンクを保持するクラスまで)。
私の質問は、ポインターを使用するか、所有権を移動するかについてコンセンサスがあるかどうかです (データ ブロックのサイズが 1 GB になる可能性があるため、可能な限りコピーを避ける必要があります)。
ポインター バージョンは次のようになります。
class FactoryClass {
...
public:
static Data * createData() {
Data * data = new Data;
...
return data;
}
};
class StorageClass {
unique_ptr<Data> data_ptr;
...
public:
void setData(Data * _data_ptr) {
data_ptr.reset(_data_ptr);
}
};
void pass() {
Data * data = FactoryClass::createData();
...
StorageClass storage;
storage.setData(data);
}
一方、移動バージョンは次のようになります。
class FactoryClass {
...
public:
static Data createData() {
Data data;
...
return data;
}
};
class StorageClass {
Data data;
...
public:
void setData(Data _data) {
data = move(_data);
}
};
void pass() {
Data data = FactoryClass::createData();
...
StorageClass storage;
storage.setData(move(data));
}
私は move バージョンの方が気に入っています - そうです、move コマンドをメイン コードに追加する必要がありますが、最終的にはストレージ内のオブジェクトだけになり、ポインター セマンティクスを気にする必要がなくなります。
しかし、私は詳細を理解していない移動セマンティクスを使用すると、あまりリラックスできません。(ただし、コードは既に Gcc4.7+ でしかコンパイルできないため、C++11 の要件は気にしません)。
いずれかのバージョンをサポートするリファレンスを誰かが持っていますか? または、データを渡す方法の他の推奨バージョンはありますか?
キーワードは通常他のトピックにつながるため、Google で何かを検索することはできませんでした。
ありがとう。
編集注: 2 番目の例は、コメントからの提案を組み込むためにリファクタリングされましたが、セマンティクスは変更されていません。