我正在尝试升级旧的 Visual Studio 6 项目。他们使用“默认”内存边界对齐。但是,Visual Studio 6 和 2013 的默认值似乎不同。
有人知道旧的默认值是什么吗?
align(1)
?
(我需要知道这一点,因为在迁移期间我们将混合使用程序。它们通过将 C 结构序列化为字节数组并在程序之间传递数组来进行通信。如果对齐方式不同,那将非常失败。)
我正在尝试升级旧的 Visual Studio 6 项目。他们使用“默认”内存边界对齐。但是,Visual Studio 6 和 2013 的默认值似乎不同。
有人知道旧的默认值是什么吗?
align(1)
?
(我需要知道这一点,因为在迁移期间我们将混合使用程序。它们通过将 C 结构序列化为字节数组并在程序之间传递数组来进行通信。如果对齐方式不同,那将非常失败。)
据我所知,Visual Studio 的(默认)布局和对齐规则在VS 6和VS 2013之间没有改变。结构成员布局在由其自然对齐要求(相对于结构表示的最低地址)控制的边界上,成员之间最多有 8 个填充字节。结构自身的对齐要求与任何成员的最大对齐要求相同。所有这些都是非常常规的,因为它确保对齐结构也对齐其所有成员。
因此,如果两个编译器生成以相同方式声明的 s 的不同二进制表示struct
,那么关于成员的某些内容很可能正在发生变化。例如,为 Win32 和 Win64 构建的代码之间的指针大小会有所不同;即使您忽略它们的值(正如您在机器之间传输数据时需要做的那样),任何指针成员的不同大小都可能会改变结构布局。
特别注意位域。底层整数数据类型的大小取决于实现,加上位域宽度有时会以不明显的方式相互作用,以影响给定的给定位置所需的此类单元的数量struct
。