.NET struct design guidelinesでは構造体の最大サイズが16バイトになります。構造体の大きさはどのようにして決定され、プログラムが実行されているアーキテクチャの影響を受けていますか?この値は32ビットのみか、両方のarchsのどちらですか?32ビットと64ビットの構造体のサイズ
答えて
はい、構造体のサイズはアーキテクチャの影響を受けます。 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バイトと思う)
これは単なる指針であり、経験則ではありません。正確な状況によっては、24バイトまたは32バイトも完全に正当化できますが、構造体がそれを大きくする場合は、最初に構造体として適切かどうかを自分自身で確かめなければなりません。それは、あなたが割り当てを実行したり、メソッド(など)に引数を渡したときに、それらの32バイトをコピーするというヒットを取ることが適切かもしれません。他の場合には、本当にクラスを使用する必要があります。
構造体の大きさをどのように決定するかについては、通常、値型には他の値型しか含まれていないため、通常はかなりわかります。構造体に参照(またはIntPtr
/UIntPtr
)が含まれている場合は、それ以上の問題ですが、それはかなりまれです。 (Mehrdadが指摘しているように、整列のためにパディングの問題もあります。)
また、私は自分の構造体を書いてほしいということは非常にまれです。あなたの状況はどうですか?
In。大部分のタイプは、32ビットと64ビットプログラムの間でサイズを変更しません。あなたは構造体に直接的または間接的にこれらのいずれかを持っていない限り、プラットフォームに基づいてそのサイズを変更しますフレームワークによって定義された唯一の2つの値の種類は、それは、
- のIntPtrですプラットフォーム間でサイズを変更すべきではありません。
Mehrdadが指摘したように、プラットフォームに基づいてサイズを変更しますフィールドの他の2つのクラスが
- あるポインタ
- 参照型
これらのタイプのすべては、しかしに変更されますまったく同じように。 32ビットプラットフォームでは4バイト、64ビットプラットフォームでは8バイトです。
- 1. 32ビットと64ビットのセットアッププロジェクト
- 2. Matlab内の別の構造体内の構造体のサイズ(R2010a 64ビットLinux)
- 3. 32ビット/ 64ビットOS?
- 4. 32ビット対64ビットのカスタムフレームワーク
- 5. Officeの32ビットdll 64ビット
- 6. 32ビットと64ビットの動作の差
- 7. ドライブCの問題32ビットと64ビット?
- 8. 32ビットと64ビットのVS 2010ビルド(プログラムファイル)
- 9. 32ビット、64ビット、参照ライブラリ
- 10. ubuntu 11.10 64ビットvs 32ビット
- 11. Office 64ビットとIE 32ビットとVBScript
- 12. Visual Studioユニットテスト32ビットと64ビット
- 13. .net InstallUtilユーティリティ - 32ビットと64ビット
- 14. Solrインデックス時間32ビットと64ビット
- 15. 64ビットLinuxの32ビットGTK +アプリケーションのコンパイル
- 16. 32ビットOutlookアドインを64ビットとして再構築する
- 17. 64ビットWeblogic Server上の32ビットJDK
- 18. WindowsのPerl:32ビットまたは64ビット?
- 19. 32ビットと64ビットマシンの両方で常に64ビットです
- 20. 64ビットアーキテクチャの32ビットOS
- 21. 32対64ビットJREのJava9
- 22. iOS 32対64ビットのアプリケーション
- 23. SQL Server(64ビット)をExcel(32ビット)にエクスポート
- 24. 64ビットWindowsで32ビットdllをインポート
- 25. MS Access 32ビットまたは64ビット
- 26. JDK 64ビットまたは32ビット?
- 27. ソフトウェアを32ビットから64ビットにコンパイル
- 28. フォーマット指定子32ビット - 64ビット
- 29. 64ビットllvm-gccで32ビットをビルド
- 30. 32ビットiOSアプリケーションを64ビットに移行
JaredParは情報がどこで入手できるのか知っていますか? – thecoop
ええ、多分私はここで間違っています。私はもう少しそれを調べます。 –
私はいくつかの興味深い結果で答えを更新しました。 –