gpt4 book ai didi

c++ - c++最佳返回结构和 vector

转载 作者:行者123 更新时间:2023-12-01 14:44:18 25 4
gpt4 key购买 nike

我正在阅读有关C++优化的许多不同文章,并且我感到很困惑。我将不胜感激。基本上,当我将 vector 和结构作为参数传递或返回 vector 和结构时,我想弄清楚什么是指针。

假设我有一个包含2个元素的结构:一个int,然后是一个整数 vector 。我将在函数中本地创建此结构,然后返回它。该函数将被多次调用,并且每次都会生成一个新结构。我想保留在类成员中创建的最后一个结构(例如lastStruct_)。因此,在返回结构之前,我可以通过某种方式更新lastStruct_。

现在,知道结构中的 vector 可能非常大(最好避免复制),这是最好的方法。结构中的 vector 是否需要为指针?如果我想通过创建get_lastStruct()方法与其他类共享lastStruct_,是否应该返回对lastStruct_的引用(指针),还是不在乎呢? lastStruct_应该是共享指针吗?

这让我很困惑,因为显然C++知道如何避免复制,但是我也看到很多人建议使用指针,而其他人则说指向 vector 的指针根本没有任何意义。

struct MyStruct {
std::vector<int> pixels;
int foo;
}

class MyClass {
MyStruct lastStruct_;
public:
MyStruct create_struct();
MyStruct getLastStruct();
}

MyClass::create_struct()
{
MyStruct s = {std::vector<int>(100, 1), 1234};
lastStruct_ = s;
return s;
}

MyClass::getLastStruct()
{
return lastStruct_;
}

最佳答案

如果您要删除的唯一副本是从工厂函数返回副本时发生的副本,那么我想说直接包含 vector 将一直更快。

为什么?两件事情。返回值优化(RVO / NRVO)将在返回时消除任何临时需求。这几乎适用于几乎所有情况。

如果不应用返回值优化,则移动语义将适用。如果NRVO不适用,则返回一个命名变量(例如:return my_struct;)将执行隐式移动。

那么,为什么它总是比共享指针快?因为在复制共享指针时,必须取消引用控制块以增加所有者计数。并且由于它是原子操作,因此递增不是免费的。

同样,使用共享指针会带来共享所有权和非本地性。如果要使用共享指针,请使用指向const数据的指针以带回值语义。

现在,您已经添加了代码,现在您正在尝试做的事情更加清楚了。

这里没有副本。如果测量性能下降,则可以使用std::shared_ptr<const std::vector<int>>作为解决方案,因为您将保留值语义,但避免使用 vector 复制。

关于c++ - c++最佳返回结构和 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58612750/

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