2

コンパイラ フラグを使用して、gcc で同等のものと比較して、msvc で基本クラスと派生クラスの同じメモリ レイアウトを作成する方法はありますか? VS2010を使用してGCC 4.1.1と比較しています

そう

#if define _MSVC
// window 
DALIGN(A,B) __declspec(align(A)) B
#else
// GCC
DALIGN(A,B) B __attribute__((aligned(A)))
#endif
class A
{ 
  DALIGN(CVector V,16);
  int a;
}
class B : public A
{
  int b;
}

A は 16 バイトでアラインされているため、0x20(32) B も 16 バイトでアラインされていますが、GCC では 0x20(32) ですが、msvc では 0x30(48) です。

GCCのようにmsvcにデータを強制的にパックする方法はありますか?

理由: データを作成し、それを異なるプラットフォームのクラスに直接ロードします。本当にいいのは、両方のプラットフォームでまったく同じデータ レイアウトを使用できることです。(はい、両方のプラットフォームでエンディアンは同じです)

4

1 に答える 1

2

クラス A とクラス B の前後に #pragma pack(push, 4) / #pragma pack(pop) を追加すると、GCC が整列するようにデータを正しく整列させることに成功しました。

継承が拡張されている場合、必要な整列されたクラスのように見え、継承を介してすべてパッキングが必要になることに注意してください。クラスの例 A、B、C、D、E、F C は整列されたメンバー C、D、E、F を持ち、すべてそれらの周りにパックが必要です。

于 2012-05-04T16:21:03.787 に答える