2009-11-26 77 views
0

在重载操作符上返回一个新对象似乎是唯一要做的事情。对?C#优化重载操作符

  • 如果你有一个类(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)来完成。我很好奇,如果有一种方法可以使用运营商。例如找出我们在赋值运算符中并执行优化的例程。

回答

3

我个人很喜欢C#如何实现这一点。

它更 “显而易见” 的是:

x += y; 

x = x + y; 

应该有相同的行为。在C#中,这是强制执行的。由于单独的过载,人们可能会滥用操作员并阻止操作人员采取相同的行动。

perf差异将会非常小,这也使得它更容易实现和维护,所以我非常喜欢C#方法。

+0

你是对的从形式语言的角度来看,这两者应该完全一样。虽然,我不确定是否有或应该有任何方法来优化这些场景。 – MandoMando 2009-11-26 17:51:53

0

所有数学二元运算符都会返回一个新对象。例如。你不希望2 + 3只是因为你添加它们而将它们中的一个的值改为五。换句话说,所讨论的操作符的语义是非常明确的,并且通过规范来执行。如果你想要不同的东西,你将不得不做出不同的东西:)。我个人比较喜欢它与C++比较,你可以使超载这样的A = B = C可能导致C被删除,B被取消分配和A等于任何值,而不考虑C或B