从返回值函数中为结构成员赋值的额外副本?

时间:2015-08-14 03:59:03

标签: c++ vector

在SO上阅读了一些帖子之后,如果我理解正确地在初始化时返回一个std :: vector值,那么如果我这样做就不会有额外的副本

std::vector<double> fun()
{
    std::vector<double> v;
    ...
    return v;
}

std::vector<double> a = fun();

这就是我目前正在做的事情,但是对于&#34;可读性&#34;我的代码的原因我想在结构中使用向量:

struct MyStruc
{
    std::vector<double> v;
    ...
};

如果我这样做

MyStruc A;
A.v = fun();
它会贵吗?通常我不关心这个,但在这里我知道我的矢量v最终会非常大,就像1亿个元素一样。所以我想知道这里发生了什么。据我所知,由于这是一项任务,因此不会有任何副本省略,但这一举措(对我来说不是很清楚)呢?在那种情况下,我该如何避免呢?感谢。

1 个答案:

答案 0 :(得分:3)

本声明:

A.v = fun();

是一个赋值,而不是初始化,因此不是RVO的候选者 - 并且必须调用赋值运算符

但是,如果您使用的是C ++ 11或更高版本,std::vector有一个移动赋值运算符,在这种情况下将使用它,因此它不是非常昂贵 - 向量的内存将是从未命名的temp转移到MyStruct字段,无需重新分配或复制大量数据。