0

C 層に PInvokes する 32 ビット .NET アセンブリがあります。このアセンブリを 64 ビットに移植したいと考えています。私は 64 ビットへの移植に関連する多くの文書を読みましたが、そのすべてが、構造体を使用する場合は位置合わせに注意する必要があることを示唆しているようです。

構造のアラインメントに関連する一般的な質問があり、何も見逃さないように最初にそれを明確にしたかったのです。

構造体ポインターを受け入れ、基本的に内部の値を埋める C エントリ ポイントがあるとします。この C コードにはパッキング ディレクティブがなく、すべての .NET 構造体が pack=8 に配置されています。したがって、隣接する int を持つ構造体を渡すと、.NET レイヤーに入力されたデータの解釈に問題がある可能性があると考えました。C はデフォルトで pack=4 を使用し、.NET では構造体を pack=8 として解釈しているためです。レイヤーなので、問題が発生する可能性があると考えました。しかし、そうではないようです。データはうまく解釈されているようです。

誰でもこの動作を説明できますか?

ありがとう、ニランジャン

4

2 に答える 2

0

デフォルトでは、構造体またはユニオンのメンバーは自然な境界に配置されます。charの場合は1バイト、shortの場合は2バイト、整数の場合は4バイトなど。nが存在する場合は、構造体または共用体メンバーの最も厳密な自然配列を指定する2の累乗である必要があります。

たとえば、#pragma pack(2)は、int、long、long long、float、double、long double、およびポインターを、自然な整列境界ではなく2バイト境界に整列します。nがプラットフォームで最も厳密な配置(x86では4つ、SPARC v8では8つ、SPARC v9では16)以上の場合、ディレクティブは自然な配置の効果があります。

x86アーキテクチャが64ビット環境をサポートしていても、8バイトアライメントをサポートしているかどうかはわかりません。結局のところ、64ビットプラットフォームでの4バイトアラインメントは何も害を及ぼしません。

#pragma align 8(変数)を使用して、グローバル変数または静的変数をどのように整列させるかをコンパイラーに指示することもできます。

于 2009-09-23T23:35:38.230 に答える
0

このmsdnの記事に出くわしました http://msdn.microsoft.com/en-us/library/aa366769(VS.85).aspx

型の自然なアラインメントよりも大きいパッキング レベルを指定しても、型のアラインメントは変更されないことが示唆されています。したがって、前述の場合の自然な配置は 4 であるため、パッキングを 8 に設定しても構造体の配置は実際には変わりません。これは動作を説明します。

于 2009-02-20T07:05:19.393 に答える