Chr*_*ris 3 c++ heap-memory bigdata c++11
我正在开发一个项目,需要从数据文件中加载许多对象并将它们存储在内存中.因为我被告知堆栈空间很少并且堆上的数据量应该更多,所以我把所有内容放在堆上.但是,我的印象是我过度了一点.
我目前的设计如下:
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)));
}
}
Run Code Online (Sandbox Code Playgroud)
从我现在所理解的,这会产生很多开销,因为我认为我不需要涉及许多独特的指针.如果我理解正确,在"指针链"中只有一个唯一的指针屏障就足够了.但是,我不确定这样做的最佳做法是什么.
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));
}
}
Run Code Online (Sandbox Code Playgroud)
这样做的好处在于,RoadMap类本身是唯一需要处理堆分配的类,并且在创建时只需要一次set.
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));
}
}
Run Code Online (Sandbox Code Playgroud)
这里唯一的指针只在main函数中,这意味着RoadMap类的用户需要知道这个对象可以变得非常大并且应该放在堆栈中.我不认为这是一个非常好的解决方案.
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)));
}
}
Run Code Online (Sandbox Code Playgroud)
此解决方案使用许多唯一指针,这意味着当删除RoadMap许多析构函数时,delete需要调用s.此外,RoadMap调用者必须unique_ptr在添加节点时提供,这意味着他必须自己进行堆分配.
现在,我赞成选项1而不是其他选项.但是,我只是在相对较短的时间内编写了C++,并且不确定我是否完全理解了内存管理背后的概念,这就是为什么我希望你(在)验证我的观点.假设选项1是最好的方法,我是否正确?对于这类事情,您是否还有其他最佳实践参考?
给Node一个移动构造函数并移动赋值运算符(以便在集合上进行操作),然后使用选项1和2的混合.std::set将已经堆分配其内容,因此您不必担心RoadMap在堆上分配a .注意额外的std::move内部addNode以允许Nodes移动到集合中.
class RoadMap
{
set<Node> allNodes;
void addNode (Node node)
{
allNodes.emplace(std::move(node));
}
};
int main()
{
RoadMap map;
// open file etc.
for (const auto& nodeData : nodesInFile)
{
map.addNode(Node(nodeData));
}
}
Run Code Online (Sandbox Code Playgroud)