0

古い Visual Studio 6 プロジェクトをアップグレードしようとしています。「デフォルト」のメモリ境界アライメントを使用します。ただし、Visual Studio 6 と 2013 のデフォルトは同じではないようです。

古いデフォルトが何であったか知っている人はいますか?
align(1)?

(移行中にプログラムが混在するため、これを知る必要があります。それらは、C構造体をバイト配列にシリアル化し、プログラム間で配列を渡すことによって通信します。アライメントが異なる場合、それはひどく失敗します。)

4

2 に答える 2

2

私が知る限り、Visual Studio の (既定の) レイアウトと配置の規則は、 VS 6VS 2013の間で変更されていません。構造体メンバーは、メンバー間の最大 8 バイトのパディングを条件として、(構造体表現の最下位アドレスに相対的な) 自然なアラインメント要件によって管理される境界上に配置されます。構造体自身のアラインメント要件は、任意のメンバーの最大アラインメント要件と同じです。構造体を整列させると、そのすべてのメンバーも整列されることが保証されるため、これはすべて非常に日常的です。

したがって、2 つのコンパイラstructが同じ方法で宣言された s の異なるバイナリ表現を生成する場合、メンバーに関する何かが変更されている可能性があります。たとえば、ポインターのサイズは、Win32 用にビルドされたコードと Win64 用にビルドされたコードでは異なります。それらの値を無視したとしても (マシン間でデータを転送するときに行う必要があるため)、ポインター メンバーのサイズが異なると、構造のレイアウトが変更される可能性があります。

特にビットフィールドに注意してください。基礎となる整数データ型のサイズは実装に依存し、さらにビットフィールド幅は、特定の .xml 内の特定の位置で必要とされるそのようなユニットの数に影響を与えるために、時には明白ではない方法で相互作用しますstruct

于 2015-03-18T15:30:10.567 に答える