GCC 与 MSVC 类打包和对齐

问题描述 投票:0回答:1

是否有一种方法可以使用编译器标志在 msvc 下创建与 gcc 中的等效项相同的基类和派生类的内存布局? 我使用 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一样打包数据?

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

gcc visual-c++ alignment
1个回答
4
投票

添加#pragma pack(push, 4) / #pragma pack(pop) 围绕 A 类和 B 类成功地正确对齐数据,就像 GCC 对齐它一样。

请注意,如果继承被扩展,似乎任何需要对齐的类以及通过继承的转发都需要打包。 示例类 A、B、C、D、E、F C 已对齐成员 C、D、E、F 都需要它们周围的包。

© www.soinside.com 2019 - 2024. All rights reserved.