2012-08-22 69 views
0

我在写一个MyClassCollection。这是一个数组,它将存储大量MyClass的实例。该阵列声明如下:MyClass[] myClassInstances;Add(MyClass ins)方法我存储insmyClassInstances通过或不通过参考?

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

这里是我当前的代码:

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; 
    } 
} 
+0

'foo_instances〜= f'与'++ foo_instances; foo_instances [$ - 1] = f;' – dav1d

+0

@ dav1d:谢谢。我会考虑使用猫操作符而不是。其实,'++ foo_instances;'这是一个错字。我的意思是'++ foo_instances.length;'。对不起! – Jack

回答

3

你有什么不合法的,甚至代码。你不能增加一个数组。如果要附加到ffoo_instances,然后使用附加操作符:

foo_instances ~= f; 

至于通过引用传递,我不太明白你问什么。 你想通过参考传递?参数add?即

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

VS

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

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

无论如何,如果你有性能问题,首要的事情就是分析你的代码。的确,有些东西显然比其他东西效率更高或更低,但是在你看到编译器实际执行的操作之前,你往往不能确定地知道结果,而结果往往与你所期望的相反。所以,如果你想知道性能,请分析你的代码。

+0

这是一个错字。对不起!我的意思是'++ foo_instances.length;' – Jack

+0

这正是我所看到的。事实上,我正在寻找它来做一个可能的*优化*。我脑子里想,通过使用'ref'关键字,编译器不需要为函数做一个参数副本。例如,foo f = new foo();方法(F);原型是void方法(ref foo f);我只会在内存中拷贝一份'f'。不像如果方法原型是:method(foo f);我会做两件事:我手工做的'f'实例,并且编译器会拷贝。我现在可以看到它是多么的不必要。 – Jack