C # оптимизация перегруженных операторов - PullRequest
0 голосов
/ 26 ноября 2009

Возвращение нового объекта на перегруженных операторах, кажется, единственное, что нужно сделать. Правильно?

  • Если у вас есть класс (X), который содержит большой буфер
  • Часть буфера содержит содержимое, остальные свободны.
  • Вы перегрузили бинарный оператор + для объединения двух объектов (одного типа), создав новый объект, содержащий добавленное содержимое обоих операндов.

Другими словами:

z = x + y // z is a new object containing the appended data from x and y. 

Это, очевидно, хорошо, потому что мы не хотим искажать x или y во время операции. Однако спецификации языка C # 7.2.2 говорят:

Когда бинарный оператор перегружен, соответствующий оператор присваивания (если таковой имеется) также неявно перегружен.

это означает, что:

x += y;  // will create a new x, copy contents of old x merged with y 
         //  and the old x will be garbage collected at some point

Это больно, потому что может быть гораздо быстрее просто скопировать содержимое y в свободную часть x. Таким образом, мы не копируем большой объект и не оставляем беспорядок для хорошего сборщика мусора.

Я понимаю, что это можно сделать с помощью простого x.Add (y). Мне любопытно, если есть способ сделать это с помощью операторов. например, чтобы выяснить, что мы находимся внутри оператора присваивания и выполнить оптимизированную процедуру.

Ответы [ 2 ]

3 голосов
/ 26 ноября 2009

Мне лично нравится, как C # реализовал это.

Более "очевидно", что:

x += y;

и

x = x + y;

Должен иметь такое же поведение. В C # это принудительно. При отдельных перегрузках люди могут злоупотреблять оператором и не допускать того же действия.

Разница в производительности будет настолько минимальной, что также облегчит реализацию и поддержку, поэтому я настоятельно предпочитаю подход C #.

0 голосов
/ 26 ноября 2009

Все математические бинарные операторы возвращают новый объект. Например. Вы не хотели бы, чтобы 2 + 3 изменяли значение одного из них на пять только потому, что вы добавляли их. Другими словами, семантика рассматриваемых операторов очень ясна и реализуется через спецификации. Если вы хотите что-то другое, вам придется сделать что-то другое :). И мне лично это нравится по сравнению с c ++, где вы можете сделать перегрузку такой, что A = B = C может привести к удалению C, B к неназначенному значению A и равному любому значению безотносительно к C или B

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