2013-02-22 49 views
5

在物體的大小而言,如何屬性,而不是get/set方法影響對象的大小,如果公開的屬性並不代表一種狀態,而是直接委託其getter和setter調用另一個實體?效應還是得到對象的大小/ set方法

例如,請考慮以下類:

public class Person 
{ 
    Address _address = new Address(); 

    public string AddressName 
    { 
     get{ return _address.Name; } 
     set { _address.Name = value; } 
    } 

    public string GetAddressName(){ return _address.Name; } 
    public void SetAddressName(string name){ _address.Name = name; } 

} 

public Address 
{ 
    public string Name { get; set; } 
} 

我猜測,創建一個新的人的時候,CLR將確定多少內存分配時考慮到AddressName財產的潛在規模。但是,如果我公開的所有內容都是Get/Set AddressName方法,則不會爲分配AddressName屬性而分配額外內存。因此,爲了節省內存佔用,在這種情況下最好使用Get/Set方法。但是,在狀態被保留時,這不會影響Address類的Name屬性。這個假設是否正確?

+1

'當創建一個新Person時,CLR會考慮AddressName的潛在大小,它不會分配足夠的空間來存儲對字符串的引用。 – 2013-02-22 13:48:43

+0

這是不是出於好奇?如果這是爲了實踐,我不會擔心生成的IL的大小上的夫婦差異(如果有任何差異的話)。 – hometoast 2013-02-22 13:49:45

+0

@IlyaIvanov,這是好奇心,但我也試圖在這個項目中考慮一些性能方面的問題。 – 2013-02-22 13:51:43

回答

15

單個對象的大小不受屬性,方法,事件等數量的影響。它影響類型元數據的大小和JITted代碼 - 但不影響每對象大小。這是受實例字段

我猜測,當創建一個新Person時,CLR將在確定需要分配多少內存時考慮AddressName屬性的可能大小。

編號只有看着你的領域。你有一個字段(_address),這樣加上正常的對象開銷都是單個實例所需的內存。

+0

這很快,謝謝喬恩。 – 2013-02-22 13:49:39

5

正如Jon已經回答的那樣,對象實例的大小通過其實例字段確定爲只有。不過,讓我進入一點細節。

一個對象實例至少爲,至少爲,與其字段大小的總和一樣大。根據字段對齊約束和CLR(公共語言運行時)佈局字段的方式,可能需要考慮一些填充字節。對於引用類型,一個實例有兩個額外的隱藏字段:同步塊索引和類型引用。兩者都是本地整數。在堆上,實例的最小大小爲12個字節(不管它們實際需要多少空間)。

採取例如以下類:

class X 
{ 
    byte value1; 
    string value2; 
    int value3; 
    long value4; 
} 

在32位系統中,X一個實例,可能需要28個字節:

  • 2倍四個字節的同步塊索引和類型參考,
  • 一個字節爲byte,
  • 三個填充字節,對齊下一個字段,
  • 四個字節的對象引用string
  • 另外四個字節0​​
  • long八個字節,

正如你所看到的,getter和setter方法和構造不佔用每個對象實例中的空間。相反,有一個單獨的對象(您知道它爲Type),它維護一組方法(getter,setter和constructors也是方法),幷包含該類型的靜態字段。您可以根據需要創建任意數量的對象實例,但對於任何給定的類型實例,只有一個Type對象。

相關問題