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)

有没有办法强制 msvc 像 GCC 一样打包数据?

这样做的原因:我创建数据并将其直接加载到不同平台上的类中。如果我可以在两个平台上使用完全相同的数据布局,那就太好了。(是的,两个平台上的字节序相同)

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 回答