0

精简版:

如果我的对象包含一个 std::vector,是否适用于按值返回该对象与按值返回向量相同的经验法则?

这在 C++11 中是否发生了变化,我理解“保证”按值返回向量很快?

长版:

我有一个包含 std::vector 的小型包装类。

class gf255_poly
{
    public:

        // ... Lots of polynomial methods

    protected:
        std::vector<unsigned char> p;
};

我想从某些函数返回这个类的实例,例如:

// Performs polynomial addition in GF(2^8). 
gf255_poly gf255_poly_add(const gf255_poly &poly1, const gf255_poly &poly2) const
{
    // Initialize:
    gf255_poly dst = poly1;

    // Add all coefficients of poly1 to poly2, respecting degree (the usual polynomial addition)
    for (int deg = 0; deg <= poly2.degree(); deg++)
        dst.addAt(deg, poly2.coef(deg));

    return dst;
}

我已经找到了大量关于如何返回成员向量以及返回 std::vector是否仍然是一种糟糕的设计模式的信息(在大多数情况下似乎这很好)。不过,我还没有找到很多包含较大对象成员的向量。

同样的建议是否适用?我是否需要在我的复制构造函数中做任何特别的事情来帮助确保返回值优化?

对于不同版本的 C++ 标准,这个问题的答案是否不同?

4

3 回答 3

2

您的写作gf255_poly dst = poly1;随后return dst;是利用命名返回值优化(NRVO)。

这是一个比返回值优化更近的创新,但肯定是由现代编译器实现的,而不管它们所针对的 C++ 标准是什么。绝对清楚,NRVO不是C++11 特定的东西。

利用 NRVO并不是一个糟糕的设计选择,因为使用它可以使源代码更易于阅读和维护。

于 2016-09-09T15:01:54.807 回答
1
  • < c++11,你应该依赖编译器来做返回值优化。

  • >= c++11,即使编译器无法(或不能)执行 RVO,您也可以使用移动语义来保持代码快速。

您需要(可能默认)在您的类中移动构造函数以启用此行为。

您也可以使用=default移动构造函数。(但visual studio 2008似乎没有这个功能)

于 2016-09-09T15:22:46.223 回答
0

这取决于你的编译器有多聪明(通常很多)。因此,无论您使用什么现代编译器,它都应该是“安全的” 。

于 2016-09-09T15:03:41.860 回答