c – 返回向量元素的副本与返回指向向量元素的指针

我有一个像这样的对象:

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)建议副本可能几乎与返回指针一样有效,承认返回指向向量元素的指针的危险.

最佳答案 参考地点

实际性能在很大程度上取决于硬件,如果您知道如何使用它,可以获得很多.

当利用参考局部性时,可以获得最大的硬件引起的性能增益之一.这意味着在时间和空间上处理非常接近的数据可以更好地利用内置CPU缓存,这比使用主存储器(RAM)快得多.

这就是为什么复制数据以允许连续的本地访问可以提高性能.

与此相反的是使用间接.间接是使用引用或指针而不是值本身访问内存的能力.这样可以避免复制事物,但是当硬件必须始终从主存储器中的不同位置获取每一位数据时,您无法充分利用CPU缓存.

必须测试性能

基本上,复制大的东西会导致一次性的性能损失,但是如果你将使用数据工作很多,你可以使用参考局部来弥补这一点.

但是,您必须自己测试才能知道什么最适合您.在您的情况下,复制数据的成本可能会比更好地利用CPU缓存所带来的性能损失更大.

点赞