2015-08-22 1 views
0

Скажем, у меня есть вектор класс следующим образом:Использует оператор + в операторе + = медленнее, чем не использовать его?

struct Vector 
{ 
    int x, y; 

    Vector operator+(Vector rhs) 
    { 
     return Vector(x + rhs.x, y + rhs.y); 
    } 
} 

И я хочу, чтобы добавить operator+=. У меня есть два варианта:

Это:

Vector& operator+=(Vector rhs) 
{ 
    *this = *this + rhs; 
    return *this; 
} 

Или это:

Vector& operator+=(Vector rhs) 
{ 
    x += rhs.x; 
    y += rhs.y; 
    return *this; 
} 

Применяя это ко всем другим operator_= с использованием соответствующих математических операторов и операторов присваивания и operator!= с помощью operator==, будет существует ли какая-либо реалистичная деградация производительности из-за дополнительных вызовов оператора, предполагая, что эти операторы используются чрезвычайно часто?

+0

По крайней мере, вы возвращаете новый вектор от оператора +, который медленнее, чем просто возвращает ссылку уже существующая структура. –

+0

В вашем конкретном случае любой компилятор может оптимизировать операции над двумя 'int', чтобы удалить любую разницу. –

ответ

1

Ни один. Вообще говоря, я бы сказал, что лучше писать operator+ (менее эффективная операция) с точки зрения operator+= (более эффективная операция).

Vector& Vector::operator+=(Vector rhs) 
{ 
    x += rhs.x; 
    y += rhs.y; 
    return *this; 
} 

Vector operator+(Vector lhs, vector rhs) 
{ 
    return lhs += rhs; 
} 

Хотя ваш вектор класс достаточно мал, что это, вероятно, не будет иметь огромное значение,

+0

Обратите внимание, что ваш 'operator +' запрещает RVO. – juanchopanza

+0

А также копирует оба операнда. –

Смежные вопросы