2016-09-09 17 views
0

Короткая версия:Неплохо ли возвращать объект по значению, содержащему вектор-член?

Если мой объект содержит зЬй :: вектор, не одни и те же правила большого пальца применяются к возвращению этого объекта по значению, как для возврата вектора по значению?

Это изменение в C++ 11, которое я понимаю, «гарантирует» возврат вектора по значению быстро?

Длинная версия:

У меня есть небольшой класс-оболочку, которая содержит зЬй :: вектор.

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; 
} 

Я нашел много информации о how to return a member vector и whether it is still a bad design pattern вернуть зЬй :: вектор (его кажется, что это нормально при большинстве обстоятельств). Я не нашел много, что включает в себя векторы, которые являются членами более крупных объектов.

Используется ли тот же совет? Нужно ли мне делать что-либо особенное в моем конструкторе копирования, чтобы помочь обеспечить оптимизацию возвращаемого значения?

Ответы на этот вопрос различны для разных версий стандарта C++?

+0

Если вы хотите быть уверены, написать двигаться конструктор для вашего gf255_poly может помочь. –

+0

@appleapple: NRVO разрешено игнорировать конструктор перемещения. – Bathsheba

+0

Это действительно зависит от возвращаемого значения возвращаемого значения. Если это уже созданный элемент, у вас есть назначение копирования/перемещения. Если это новый объект, то, скорее всего, NRVO начнет атаковать. – NathanOliver

ответ

2

gf255_poly dst = poly1; Ваше письмо с последующим return dst; эксплуатирует Named Возвращаемое значение оптимизации (NRVO).

Это новейшая инновация, чем Оптимизация возвращаемого значения, но, безусловно, реализована современными компиляторами, независимо от того, какой стандарт C++ они таргетируют. Чтобы быть абсолютно ясным, NRVO - это не a C++ 11.

Эксплуатация NRVO не Плохой выбор дизайна, поскольку использование его облегчает чтение и обслуживание исходного кода.

0

Это зависит от того, насколько умен ваш компилятор (как правило, много). Поэтому он должен быть «безопасным» на любом компиляторе.

1
  • < C++ 11, вы должны полагаться на компилятор, чтобы сделать Оптимизацию возвращаемого значения.

  • > = C++ 11, вы можете использовать семантику перемещения, чтобы сохранить код быстрее, даже если компилятор не может (или не может) выполнить RVO.

Для этого необходимо иметь (возможно, по умолчанию) перемещать конструктор в своем классе.

Вы также можете использовать =default на ходу конструктора. (Но Visual Studio 2008, кажется, не имеют этой функции)