2010-11-17 33 views
4

這一直是我的一個好奇心,我沒有得到分析發現,並且還沒有看到它問過(對於AS3):使用靜態方法和實例方法的AS3對象內存使用情況

比方說,我有一個類:

class MyClass { 
    public function myMethod():String { 
     return "some return value"; 
    } 
} 

將被實例化了很多次:

for (var i:Number = 0; i < 10000; i++) { 
    var myObject:MyClass = new MyClass(); 
    trace(myObject.myMethod); 
} 

將改變myMethod靜電對內存FO任何變化我的應用程序的otprint?

mxmlc是否足夠智能地對該函數進行單引用?

基本上,如果我把我的方法非靜態纔會有:

  1. 從靜態版本就內存而言
  2. 的方法沒有什麼區別
  3. 出1萬隻個小實例引用到一個單一的功能
  4. 10,000函數字節碼重複

在內存中?

回答

6

是的,內存使用情況會有所不同。基本上,因爲在一種情況下你有一個類,而另一個類中有一個類和10,000個實例。

雖然函數本身的代碼不會被重複10,000次。在這兩種情況下,內存中只有一個功能。拋開語義,實例方法幾乎是一個靜態函數,它將對實例的引用作爲其第一個參數傳遞。

此參數是通過你的Actionscript隱藏的,因爲它在大多數語言(儘管別人,比如Python,我想,讓你在聲明函數定義一個self/this參數;您不必明確地傳遞但在通話時間)。

每個對象都存儲對其方法的引用(在實際運行時類型中聲明的方法以及繼承方法),通常位於名爲vtable的結構中。調用這些方法的協議通常涉及在表中找到函數,並調用它傳遞對該方法被調用的對象的引用,以及其餘參數(如果有的話)。

無論如何,在某些情況下,靜態選項可能是合法的選擇(最明顯的是當你沒有狀態保留,所以你真的不需要一個對象),但通常情況下,實例方法更靈活,限制更少。無論如何,我會說在幾乎所有情況下,選擇一個選項還是基於哪個選項佔用較少內存都是不明智的。

+0

參考第一段,兩種情況下都會有10,000個實例。問題是如果將myMethod更改爲靜態將改變內存使用情況。從兩個答案看,它不會。 – umop 2010-11-17 03:18:04

+1

@umop。我從代碼示例中看到,我認爲在使用靜態方法的情況下不會創建10,000個實例。無論如何,如果你聲明瞭一個實例方法,函數本身的代碼將不會被複制。唯一的額外空間將是特性對象中的一個額外插槽,以引用此方法,對於更實用的目的應該可以忽略不計。 – 2010-11-17 11:37:46

相關問題