データ ファイルから多くのオブジェクトを読み込んでメモリに保存する必要があるプロジェクトに取り組んでいます。スタックスペースはまれであり、大量のデータをヒープに配置する必要があると言われたので、すべてをヒープに配置しました。ただ、ちょっとやり過ぎた印象です。
私の現在のデザインは次のようになります。
class RoadMap
{
unique_ptr<set<unique_ptr<Node>>> allNodes;
void addNode(unique_ptr<Node> node)
{
this->allNodes->insert(std::move(node));
}
}
int main()
{
unique_ptr<RoadMap> map(new RoadMap());
// open file etc.
for (auto nodeData : nodesInFile)
{
map->addNode(unique_ptr<Node>(new Node(nodeData)));
}
}
私が今理解していることから、これは多くのオーバーヘッドを生み出します。これは、私が必要ではないと思う多くの一意のポインターが関係しているためです。私の理解が正しければ、「ポインター チェーン」に一意のポインター バリアが 1 つあれば十分です。ただし、これを行うためのベストプラクティスが何であるかはわかりません。
オプション1
class RoadMap
{
unique_ptr<set<Node>> allNodes;
void addNode (Node node)
{
this->allNodes->insert(node);
}
}
int main()
{
RoadMap map;
//open file etc.
for (auto nodeData : nodesInFile)
{
map.addNode(Node(nodeData));
}
}
これの利点は、RoadMap
クラス自体がヒープ割り当てを処理する必要がある唯一のものであり、set
.
オプション 2
class RoadMap
{
set<Node> allNodes;
void addNode (Node node)
{
this->allNodes.insert(node);
}
}
int main()
{
unique_ptr<RoadMap> map(new RoadMap());
// open file etc.
for (auto nodeData : nodesInFile)
{
map->addNode(Node(nodeData));
}
}
ここでは、一意のポインターはメイン関数内にのみあります。つまり、RoadMap
クラスのユーザーは、このオブジェクトが非常に大きくなる可能性があり、スタックに置く必要があることを知る必要があります。これはあまり良い解決策ではないと思います。
オプション 3
class RoadMap
{
set<unique_ptr<Node>> allNodes;
void addNode(unique_ptr<Node> node)
{
this->allNodes.insert(std::move(node));
{
}
int main()
{
RoadMap map;
// open file etc.
for (auto nodeData : nodesInFile)
{
map.addNode(unique_ptr<Node>(new Node(nodeData)));
}
}
このソリューションは多くの一意のポインタを使用します。つまり、RoadMap
多くのデストラクタを削除するときにdelete
s を呼び出す必要があります。また、RoadMap
呼び出し元はunique_ptr
、ノードを追加するときに を指定する必要があります。つまり、ヒープ割り当てを自分で行う必要があります。
現在、私は他のオプションよりもオプション 1 を支持しています。しかし、私は C++ のコーディングを比較的短期間しか行っておらず、メモリ管理の背後にある概念を完全に理解しているかどうか確信が持てません。オプション1がこれを行うための最良の方法であると仮定するのは正しいですか? この種のベスト プラクティスへの追加の参照はありますか?