2012-08-22 68 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