6

オブジェクトサイズに関して、公開されたプロパティが状態を表さず、単にそのゲッターとセッターの呼び出しを別のエンティティに委任する場合、Get / 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; }
}

新しいPersonが作成されると、CLRは、割り当てるメモリの量を決定するときに、AddressNameプロパティの潜在的なサイズを考慮に入れると思います。ただし、公開したのがGet / Set AddressNameメソッドだけの場合、AddressNameプロパティに対応するために割り当てられる追加のメモリはありません。したがって、メモリフットプリントを節約するには、この場合はGet/Setメソッドを使用することをお勧めします。ただし、状態は保持されているため、これはAddressクラスのNameプロパティとの違いはありません。この仮定は正しいですか?

4

2 に答える 2

15

個々のオブジェクトのサイズは、プロパティ、メソッド、イベントなどの数には影響されません。タイプメタデータのサイズ、およびJITtedコードには影響しますが、オブジェクトごとのサイズには影響しません。これは、インスタンスフィールドによってのみ影響を受けます。

新しいPersonが作成されると、CLRは、割り当てるメモリの量を決定するときに、AddressNameプロパティの潜在的なサイズを考慮に入れると思います。

いいえ、それはあなたの分野だけを見ます。単一のフィールド(_address)があるため、通常のオブジェクトオーバーヘッドに加えて、単一のインスタンスに必要なすべてのメモリがあります。

于 2013-02-22T13:47:45.543 に答える
6

Jonがすでに回答したように、オブジェクトインスタンスのサイズは、そのインスタンスフィールドによってのみ決定されます。ただし、もう少し詳しく説明します。

オブジェクトインスタンスは、少なくともそのフィールドのサイズの合計と同じ大きさです。フィールドの配置の制約とCLR(共通言語ランタイム)がフィールドをレイアウトする方法によっては、一部のパディングバイトを考慮する必要がある場合があります。参照型の場合、インスタンスには、同期ブロックインデックスと型参照の2つの追加の非表示フィールドがあります。どちらもネイティブ整数です。ヒープ上では、インスタンスの最小サイズは12バイトです(実際に必要なスペースの量に関係なく)。

たとえば、次のクラスを考えてみましょう。

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

32ビットシステムでは、のインスタンスにX28バイトが必要になる場合があります。

  • 同期ブロックインデックスとタイプ参照の4バイトの2倍、
  • の1バイトbyte
  • 次のフィールドを揃えるための3つのパディングバイト、
  • オブジェクト参照用の4バイトstring
  • のための別の4バイトint
  • long、の場合は8バイト

ご覧のとおり、ゲッターとセッター、メソッド、コンストラクターは、各オブジェクトインスタンスでスペースを占有しません。Type代わりに、メソッドのリストを維持し(ゲッター、セッター、コンストラクターもメソッドです)、その型の静的フィールドを含む別のオブジェクト(あなたが知っている)があります。Type型のオブジェクトインスタンスはいくつでも作成できますが、特定の型インスタンスには1つのオブジェクトしかありません。

于 2013-02-22T14:55:18.563 に答える