Короткая версия:Неплохо ли возвращать объект по значению, содержащему вектор-член?
Если мой объект содержит зЬй :: вектор, не одни и те же правила большого пальца применяются к возвращению этого объекта по значению, как для возврата вектора по значению?
Это изменение в 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++?
Если вы хотите быть уверены, написать двигаться конструктор для вашего gf255_poly может помочь. –
@appleapple: NRVO разрешено игнорировать конструктор перемещения. – Bathsheba
Это действительно зависит от возвращаемого значения возвращаемого значения. Если это уже созданный элемент, у вас есть назначение копирования/перемещения. Если это новый объект, то, скорее всего, NRVO начнет атаковать. – NathanOliver