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
实例,以及编译器复制的实例。我现在可以看出它是多么的不必要。