Parameter passing 通过还是不通过?

Parameter passing 通过还是不通过?,parameter-passing,pass-by-reference,pass-by-value,d,Parameter Passing,Pass By Reference,Pass By Value,D,我正在写一个MyClassCollection。它是一个数组,将存储大量的MyClass实例。数组声明如下:MyClass[]myClassInstances通过Add(myclassins)方法将ins存储在myClassInstances中 我的问题是:我应该通过引用吗?我会有更好的表现吗?我真的不需要它的副本;我更喜欢使用实例化类(对吗?);或者这是一个无用的优化努力(可能只是内存?) 以下是我当前的代码: class foo { } class foocollection { pr

我正在写一个
MyClassCollection
。它是一个数组,将存储大量的
MyClass
实例。数组声明如下:
MyClass[]myClassInstances
通过
Add(myclassins)
方法将
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;
  }
}

你所拥有的甚至都不是法律法规。不能增加数组。如果要将
f
附加到
foo\u实例
,请使用append运算符:

foo_instances ~= f;
至于间接引荐,我不太明白你的意思。你想通过引用传递什么?
添加
的参数?i、 e

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

ref
是毫无意义的。您没有更改传入的类引用,因此没有理由使用
ref
。那只会让人困惑。虽然您需要100%确定性能影响是什么,但如果通过
ref
的速度更快,我会非常惊讶。类在传递给函数时不会被复制。它们是引用类型。因此,被复制的是引用,而不是对象。它基本上是一个指针(尽管我相信它确实有一些额外的类型,所以它比指针稍微多一些)。复制它们很便宜。您不必担心将类传递给函数的成本。如果您使用的是结构,它可能会有所不同,因为结构通常是值类型,除非您显式地将它们放在堆上,否则它位于堆栈上,但对于类来说,这不是问题


不管怎样,如果您有性能问题,首先要做的就是分析代码。确实,有些事情的效率明显高于或低于其他事情,但在看到编译器的实际功能之前,通常无法确定,结果往往与预期相反。因此,如果您想了解性能,请分析您的代码。

您拥有的甚至不是法律代码。不能增加数组。如果要将
f
附加到
foo\u实例
,请使用append运算符:

foo_instances ~= f;
至于间接引荐,我不太明白你的意思。你想通过引用传递什么?
添加
的参数?i、 e

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

ref
是毫无意义的。您没有更改传入的类引用,因此没有理由使用
ref
。那只会让人困惑。虽然您需要100%确定性能影响是什么,但如果通过
ref
的速度更快,我会非常惊讶。类在传递给函数时不会被复制。它们是引用类型。因此,被复制的是引用,而不是对象。它基本上是一个指针(尽管我相信它确实有一些额外的类型,所以它比指针稍微多一些)。复制它们很便宜。您不必担心将类传递给函数的成本。如果您使用的是结构,它可能会有所不同,因为结构通常是值类型,除非您显式地将它们放在堆上,否则它位于堆栈上,但对于类来说,这不是问题


不管怎样,如果您有性能问题,首先要做的就是分析代码。确实,有些事情的效率明显高于或低于其他事情,但在看到编译器的实际功能之前,通常无法确定,结果往往与预期相反。因此,如果您想了解性能,请分析您的代码。

foo_实例~=f
的作用与
++foo_实例相同;foo_实例[$-1]=f@dav1d:谢谢。我将考虑使用CAT运算符代替。实际上,
++foo_实例那是个打字错误。我的意思是
++foo_instances.length。对不起
foo_实例~=f
++foo_实例相同;foo_实例[$-1]=f@dav1d:谢谢。我将考虑使用CAT运算符代替。实际上,
++foo_实例那是个打字错误。我的意思是
++foo_instances.length。我很抱歉!那是个打字错误。我很抱歉!我的意思是
++foo_instances.length这正是我要找的。事实上,我正在寻找它做一个可能的优化。我的想法是,通过使用
ref
关键字,编译器将不需要为函数复制参数。e、 g,foo f=新的foo();方法(f);其中原型为无效方法(参考f);我只想在内存中保存一份
f
。与方法原型不同的是:方法(foo-f);我想要两个:我手工做的
f
实例,以及编译器复制的实例。我现在可以看出这是多么不必要。这是一个打字错误。我很抱歉!我的意思是
++foo_instances.length这正是我要找的。事实上,我正在寻找它做一个可能的优化。我的想法是,通过使用
ref
关键字,编译器将不需要为函数复制参数。e、 g,foo f=新的foo();方法(f);其中原型为无效方法(参考f);我只想在内存中保存一份
f
。与方法原型不同的是:方法(foo-f);我想要两个:我手工制作的
f
实例,以及编译器复制的实例。我现在可以看出它是多么的不必要。