Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c++;最优返回结构与向量 我在C++优化方面读了很多不同的东西,我现在变得很混乱。我希望能得到一些帮助。基本上,当我将向量和结构作为参数传递或返回向量和结构时,我想弄清楚什么是指针,什么不是指针_C++_Pointers_Vector - Fatal编程技术网

c++;最优返回结构与向量 我在C++优化方面读了很多不同的东西,我现在变得很混乱。我希望能得到一些帮助。基本上,当我将向量和结构作为参数传递或返回向量和结构时,我想弄清楚什么是指针,什么不是指针

c++;最优返回结构与向量 我在C++优化方面读了很多不同的东西,我现在变得很混乱。我希望能得到一些帮助。基本上,当我将向量和结构作为参数传递或返回向量和结构时,我想弄清楚什么是指针,什么不是指针,c++,pointers,vector,C++,Pointers,Vector,假设我有一个包含两个元素的结构:一个int,然后是一个整数向量。我将在函数中本地创建这个结构,然后返回它。此函数将被多次调用,并每次生成一个新结构。我希望保留在类成员中创建的最后一个结构(例如lastStruct)。因此,在返回结构之前,我可以以某种方式更新lastStruct 现在,知道结构中的向量可能非常大(需要避免拷贝),那么最好的方法是什么呢。结构中的向量需要是指针吗?如果我想通过创建get_lastStruct()方法将lastStruct共享给其他类,我应该返回对lastStruct

假设我有一个包含两个元素的结构:一个int,然后是一个整数向量。我将在函数中本地创建这个结构,然后返回它。此函数将被多次调用,并每次生成一个新结构。我希望保留在类成员中创建的最后一个结构(例如lastStruct)。因此,在返回结构之前,我可以以某种方式更新lastStruct

现在,知道结构中的向量可能非常大(需要避免拷贝),那么最好的方法是什么呢。结构中的向量需要是指针吗?如果我想通过创建get_lastStruct()方法将lastStruct共享给其他类,我应该返回对lastStruct的引用、指针,还是不关心这个问题?lastStruct_uu应该是共享指针吗


这对我来说很混乱,因为显然C++知道如何避免复制,但是我也看到很多人建议使用指针,而其他人则认为指针指向一点都没有意义。

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_;
}
struct MyStruct{
std::矢量像素;
int foo;
}
类MyClass{
MyStruct lastStruct;
公众:
MyStruct create_struct();
MyStruct getLastStruct();
}
MyClass::create_struct()
{
MyStruct s={std::vector(100,1),1234};
lastStruct_uuz=s;
返回s;
}
MyClass::getLastStruct()
{
返回lastStruct;
}

如果您试图删除的唯一副本是从factory函数返回时发生的副本,那么直接包含向量的速度会一直更快

为什么??两件事。返回值优化(RVO/NRVO)将消除返回时对临时值的任何需要。这对于几乎所有情况都足够了

当返回值优化不适用时,移动语义将生效。在NRVO不适用的情况下,返回命名变量(例如:
returnmystruct;
)将执行隐式移动

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

此外,使用共享指针会带来共享所有权和非局部性。如果要使用共享指针,请使用指向常量数据的指针返回值语义


既然您添加了代码,那么您要做的事情就清楚多了


这里没有办法绕过副本。如果你测量性能退化,那么包含一个<代码>:ST::SysDypPTR 可能是解决方案,因为你将保持值语义,但是避免矢量拷贝。

所以它依赖于C++版本,任何比C++ 11更新的都应该做RVO。更新的版本甚至可以保证避免复制。“很多人建议使用指针”。他们只是还没有收到备忘录,所以我的理解是结构中的向量应该是一个普通向量。应该正常返回结构(返回_结构)。属性lastStruct_uu应为普通结构。我会用普通的assignaton lastStruct更新。最后,当我通过getter共享这个lastStruct时,我只需返回lastStruct?它真的那么简单吗(C++>11真的那么好吗)?谢谢您提供的详细信息。我相信我是为了结构中的向量而跟随你的。结构被返回,然后超出范围,因此C++知道如何优化这个结构。但是对于包含最后创建的结构的类属性lastStruct,此结构将始终在作用域中。因此,当我尝试将此变量共享给其他类以便它们可以访问最后可用的数据时,如果我只是
返回lastStruct C++是否需要复制它?移动将“窃取”我想要的数据。@XDD如果您想要一个私有数据成员和一个getter,那么对const的引用将消除复制的需要,因为在这种情况下
return nonLocal
将始终复制。除非您执行std::move(非本地)
,但我会避免这样做。好的,我明白了。我想这回答了我的大部分问题。C++足够聪明,当返回一个超出范围的对象时,避免复制。然后,对const的引用将使共享私有成员(lastStruct)变得简单快捷。最后一个问题是私有成员lastStruct的更新。在创建并返回本地结构的工厂中,我想更新lastStruct。有没有避免复制的方法?如果您执行
my_member=make_struct()
,那么就没有复制,因为
make_struct()
返回的对象是临时对象。在这种情况下,这是一个移动。@XDD哦,我刚刚看到了带有代码的示例,我知道你所说的最后一个结构是什么意思。不,你基本上想要一个拷贝,所以C++不能帮助你删除它。如果您真的想避免复制整个向量,我会尝试
std::shared\u ptr
来保持值的语义。即便如此,我还是会将共享指针隐藏为私有成员。