2009-07-27 24 views

答えて

3

はい、構造体のサイズはアーキテクチャの影響を受けます。 32ビットのC#構造体は4バイトの境界で整列され、64ビットでは8バイト整列されます。

例:この構造体の

struct Foo 
{ 
    int bar; 
} 

インスタンスは、「int型のバーは、」32ビットと64ビットの両方のプロセス上のわずか4バイトを取るにもかかわらず、32ビットプロセスでは4バイト、64ビットプロセスで8つのバイトを占有します。

更新:

私はこれでいくつかのテストをしました。私はこの出力を取得、64ビットプロセスとして

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace ConsoleApplication3 
{ 
    struct Bar 
    { 
     int a; 
    } 

    struct Foo 
    { 
     Uri uri; 
     int a; 
    } 

    class Program 
    { 
     static void Main(string[] args) 
     { 
      Foo[] foo; 
      long fooBefore = System.GC.GetTotalMemory(true); 
      foo = new Foo[10]; 
      long fooAfter = System.GC.GetTotalMemory(true); 

      Bar[] bar; 
      long barBefore = System.GC.GetTotalMemory(true); 
      bar = new Bar[10]; 
      long barAfter = System.GC.GetTotalMemory(true); 

      Foo aFoo = new Foo(); 
      Bar aBar = new Bar(); 

      System.Console.Out.WriteLine(String.Format("[Foo] Size of array of 10: {0}, Marshal size of one: {1}", fooAfter - fooBefore, System.Runtime.InteropServices.Marshal.SizeOf(aFoo))); 
      System.Console.Out.WriteLine(String.Format("[Bar] Size of array of 10: {0}, Marshal size of one: {1}", barAfter - barBefore, System.Runtime.InteropServices.Marshal.SizeOf(aBar))); 
      System.Console.ReadKey(); 
     } 
    } 
} 

:私はこのコードを書いた32ビットプロセスとして

[Foo] Size of array of 10: 208, Marshal size of one: 16 
[Bar] Size of array of 10: 88, Marshal size of one: 4 

を、私はこの出力を得る:

[Foo] Size of array of 10: 92, Marshal size of one: 8 
[Bar] Size of array of 10: 64, Marshal size of one: 4 

観察:

  • 単純な構造体のBarは、32ビットの両方で4バイトを占めるようです64ビットのプロセス
  • 他の構造体Fooは、32ビット(intの場合は4バイト、Uriへの参照の場合は4バイト)ではなく、64ビットの場合は16バイト(intの場合は4バイト、 Uriへの参照のためのバイト、そして私はアライメントのために4バイトと思う)
+0

JaredParは情報がどこで入手できるのか知っていますか? – thecoop

+0

ええ、多分私はここで間違っています。私はもう少しそれを調べます。 –

+0

私はいくつかの興味深い結果で答えを更新しました。 –

6

これは単なる指針であり、経験則ではありません。正確な状況によっては、24バイトまたは32バイトも完全に正当化できますが、構造体がそれを大きくする場合は、最初に構造体として適切かどうかを自分自身で確かめなければなりません。それは、あなたが割り当てを実行したり、メソッド(など)に引数を渡したときに、それらの32バイトをコピーするというヒットを取ることが適切かもしれません。他の場合には、本当にクラスを使用する必要があります。

構造体の大きさをどのように決定するかについては、通常、値型には他の値型しか含まれていないため、通常はかなりわかります。構造体に参照(またはIntPtr/UIntPtr)が含まれている場合は、それ以上の問題ですが、それはかなりまれです。 (Mehrdadが指摘しているように、整列のためにパディングの問題もあります。)

また、私は自分の構造体を書いてほしいということは非常にまれです。あなたの状況はどうですか?

4

In。大部分のタイプは、32ビットと64ビットプログラムの間でサイズを変更しません。あなたは構造体に直接的または間接的にこれらのいずれかを持っていない限り、プラットフォームに基づいてそのサイズを変更しますフレームワークによって定義された唯一の2つの値の種類は、それは、

  • UIntPtr
    • のIntPtrですプラットフォーム間でサイズを変更すべきではありません。

      Mehrdadが指摘したように、プラットフォームに基づいてサイズを変更しますフィールドの他の2つのクラスが

      • あるポインタ
      • 参照型

      これらのタイプのすべては、しかしに変更されますまったく同じように。 32ビットプラットフォームでは4バイト、64ビットプラットフォームでは8バイトです。

    関連する問題