【发布时间】:2015-03-27 14:21:02
【问题描述】:
我有一个这样的对象:
class Node {
float x, y, z;
size_t tag;
bool isFree;
std::vector<size_t> connections; // Usually ~10-100 in length
};
只是为了让您了解大小。这些节点对象的列表包含数百万个实例,我将其称为std::vector<Node> masterNodes。我在其他地方有一个函数,它返回这些对象的容器,例如这个:
std::vector<Node> find_nodes()
{
std::vector<Node> nodes;
// copy some elements from masterNodes that meet our conditions
return nodes;
}
我的问题是返回 Node* 的向量是否会更有效,或者我的编译器是否会对其进行足够优化,以使像我这样的对象的增益最小?例如
std::vector<Node*> find_nodes()
{
std::vector<Node*> nodes;
// point to some elements from masterNodes that meet our conditions
return nodes;
}
我看到了一些回复(例如this one),这些回复表明复制可能几乎与返回指针一样有效,并承认返回指向向量元素的指针的危险。
【问题讨论】:
-
如果每个
Node有一个std::vector可能有100 个元素,而你有一个std::vector<Node>,那肯定会比std::vector<Node*>大很多。只需确保您知道谁应该管理该内存,这样您就不会泄漏它,也不会持有悬空指针。 -
对象向量很可能会更有效。但如果这很重要,您应该同时尝试并查看(但在您的基准测试中包括第二个版本所需的潜在内存管理。)
-
另一种选择是返回索引,我想。但这将我与一个向量联系在一起,这意味着我必须将索引引用回 masterNodes。不过,这并不是一个完全没有吸引力的想法,因为索引也在问题域中,而不仅仅是实现。节点有索引。
-
我认为“回归”在这里并不重要。从 masterNodes 复制节点是这里真正的问题。复制完成后,返回应该非常有效(感谢 RVO)。 RVO 可以申请,并且会使回报非常有效。但是我们不关心快速返回,因为
find_nodes()内的复制本身很慢。 -
你对从
find_nodes()检索到的节点向量做了什么?这是确定最适合您问题的解决方案的重要细节。