C ++ перегружает оператор равенства.Должен ли я написать свою функцию, чтобы принять аргумент, переданный по ссылке или значению? - PullRequest
0 голосов
/ 20 марта 2019

Я хочу перегрузить оператор == для простой структуры

struct MyStruct {
public:
   int a;
   float b;
   bool operator==( ) {  }
}

Кажется, что все примеры, которые я вижу, передают значение по ссылке, используя &.

Но я действительно хочу передать эти структуры по значению.

Что-то не так, когда я пишу это как

bool operator== (MyStruct another) { return ( (a==another.a) && (b==another.b) ); } 

Ответы [ 2 ]

1 голос
/ 20 марта 2019

Хотя постоянство - похвальная цель, не стоит переусердствовать. Программа, содержащая только символы «А», будет очень последовательной, но вряд ли полезной. Механизм передачи аргументов - это не то, что вы делаете из непоследовательности, это техническое решение, основанное на определенных технических аспектах.

Например, в вашем случае передача по значению может потенциально привести к повышению производительности, поскольку структура достаточно мала и используется для AMD64 ABI (той, которая используется на любом 64-битном чипе Intel / AMD) оно будет передано в регистр, что позволит сэкономить время, обычно связанное с разыменованием.

С другой стороны, в вашем случае разумно предположить, что функция будет встроенной, и схема передачи не будет иметь никакого значения (так как она не будет передана). Это доказано здесь codegen (в сгенерированной сборке нет вызова operator==): https://gcc.godbolt.org/z/G7oEgE

1 голос
/ 20 марта 2019

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

При этом прохождение через const reference имеет больше смысла, поскольку оно четко выражает намерение перегруженной функции ==.const гарантирует, что перегруженная функция случайно не изменит объект, а передача по ссылке избавит вас от копирования.Для оператора == нет необходимости передавать копию только для целей сравнения.

Если вас беспокоит согласованность, лучше переключить другой проход по экземплярам значения для передачи по const ref.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...