gpt4 book ai didi

c++ - 返回 vector 元素的拷贝与返回指向 vector 元素的指针

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:09:27 24 4
gpt4 key购买 nike

我有一个这样的对象:

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* vector 会不会更有效,或者我的编译器是否会对其进行足够的优化,使像我这样的对象的增益最小?例如

std::vector<Node*> find_nodes()
{
std::vector<Node*> nodes;
// point to some elements from masterNodes that meet our conditions
return nodes;
}

我看到一些回复(例如 this one)暗示拷贝可能几乎与返回指针一样有效,承认返回指向 vector 元素的指针的危险。

最佳答案

引用地点

现实生活中的性能在很大程度上取决于硬件,如果您知道如何使用它,就可以获得很多。

当利用引用位置时,可以实现硬件带来的最大性能提升之一。这意味着处理在时间和空间上都非常接近的数据可以更好地利用内置 CPU 缓存,这比使用主内存 (RAM) 快得多。

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

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

必须测试性能

基本上,复制大数据会导致一次性性能下降,但如果您要处理大量数据,则可以使用引用局部性来弥补这一点。

但是,您必须自己进行测试才能知道哪种方式最适合您。在您的情况下,与更好地使用 CPU 缓存所弥补的相比,复制数据的成本可能会导致更大的性能损失。

关于c++ - 返回 vector 元素的拷贝与返回指向 vector 元素的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29302932/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com