通过或不通过参考?

时间:2012-08-22 20:54:56

标签: parameter-passing pass-by-reference pass-by-value d

我正在写MyClassCollection。它是一个数组,会存储很多MyClass的实例。该数组声明如下:MyClass[] myClassInstances;Add(MyClass ins)方法我将ins存储在myClassInstances中。

我的问题是:我应该通过引用传递它吗?我会获得更好的表现吗?我真的不需要它的副本;我更喜欢使用实例化的类(对吧?);或者它是无用的优化(可能只是内存?)。

这是我目前的代码:

class foo { }

class foocollection {
  private foo[] foo_instances;
  public @property foo[] data() { return foo_instances; }
  public void add(foo f) {
     ++foo_instances.length;
      foo_instances[$-1] = f;
  }
}

1 个答案:

答案 0 :(得分:3)

你所拥有的甚至不是合法代码。您无法增加数组。如果您要将f追加到foo_instances,请使用追加运算符:

foo_instances ~= f;

至于参考传递,我不太明白你的要求。 你想通过引用传递什么add的论点?即。

public void add(foo f) {...}

VS

public void add(ref foo f) {...}

ref毫无意义。你没有改变传入的类引用,所以没有理由使用ref。那只会令人困惑。虽然你需要分析100%确定性能影响是什么,如果经过ref更快,我会感到非常惊讶。将类传递给函数时,不会复制类。他们是参考类型。所以,它是被复制的参考 - 而不是对象。它基本上是一个指针(虽然我相信它确实有一些额外的类型的东西,所以它只是一个指针)。复制它们很便宜。您不必担心将类传递给函数的成本。如果您使用 struct ,它可能会有所不同,因为结构通常是值类型并且在堆栈上,除非您明确地将它们放在堆上,但对于类,它不是问题。

无论如何,如果您有性能问题,那么要做的第一件事就是分析您的代码。确实有些东西显然比其他东西效率更高或更低,但是在看到编译器实际执行的操作之前,您通常不会确切知道,结果往往与您的预期相反。因此,如果您想了解性能,请分析您的代码。