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