使用不同的结构对齐设置
Using different structure alignment settings
混合(Visual Studio)C/C++项目有什么结构对齐选项设置不同的问题?我知道我显然可以在不同的项目中设置不同的选项,但这对输出的行为有影响吗 library/application?
假设我有一个库,其结构对齐设置为 1 字节,如果我有一个链接到该库但将结构对齐设置为默认值的应用程序,会有问题吗?如果应用程序不使用库的结构,会有什么不同吗?
感谢您对此的任何帮助!
结构布局由编译时影响的对齐规则决定。出于效率原因,结构成员的对齐方式使其在内存中的地址是 2、4、8 或有时更大值的倍数。
根据结构成员的大小和对齐要求,在结构成员之间插入额外的填充,并且可以在结构的末尾添加额外的填充,以允许结构数组保持此对齐对所有数组元素的成员有效。 malloc
保证 return 指针对齐用于所有实际目的:
如果分配成功,指针 return 已适当对齐,因此可以将其分配给指向具有基本对齐要求的任何类型对象的指针。
这种行为有时可以通过编译器开关和/或编译指示来控制,这似乎可以通过 Visual C/C++ 实现。
结果对于所述选项将产生不同填充的结构很重要。访问结构成员的代码在处理共享数据的各种库和程序中不同,调用 未定义的行为。
因此强烈建议不要对不同编译代码段之间共享的数据结构使用不同的对齐选项。无论它们存在于不同的程序、动态库、静态链接的目标文件、用户或内核代码、设备驱动程序等中,结果都是相同的:具有潜在灾难性后果的未定义行为(与任何 UB 一样)。
它只对不兼容模块之间使用和共享的结构很重要,但随着时间的推移很难跟踪谁使用和谁不使用共享头文件中发布的结构定义。仅在本地使用且其定义不可见的结构应该不会造成问题,但只要它们保持私有即可。
如果您使用编译时开关,所有 结构将受这些影响,包括 C 库中的标准定义,以及头文件中本地或全局定义的所有结构。标准包含文件可能有规定使它们免受此类差异的影响,但您自己的结构定义不会。
除非您确切知道为什么需要这样做,否则不要使用编译时开关执行此操作。不要在源代码中这样做(通过编译指示、属性和其他不可移植的结构),除非您是真正的专家,可以完全控制数据的每次使用。
如果您关注结构包装,请重新排序struct
成员并选择其类型以实现您的目标。在 极易出错 中更改编译器的打包规则。有关完整研究,请参阅 http://www.catb.org/esr/structure-packing/。
混合(Visual Studio)C/C++项目有什么结构对齐选项设置不同的问题?我知道我显然可以在不同的项目中设置不同的选项,但这对输出的行为有影响吗 library/application?
假设我有一个库,其结构对齐设置为 1 字节,如果我有一个链接到该库但将结构对齐设置为默认值的应用程序,会有问题吗?如果应用程序不使用库的结构,会有什么不同吗?
感谢您对此的任何帮助!
结构布局由编译时影响的对齐规则决定。出于效率原因,结构成员的对齐方式使其在内存中的地址是 2、4、8 或有时更大值的倍数。
根据结构成员的大小和对齐要求,在结构成员之间插入额外的填充,并且可以在结构的末尾添加额外的填充,以允许结构数组保持此对齐对所有数组元素的成员有效。 malloc
保证 return 指针对齐用于所有实际目的:
如果分配成功,指针 return 已适当对齐,因此可以将其分配给指向具有基本对齐要求的任何类型对象的指针。
这种行为有时可以通过编译器开关和/或编译指示来控制,这似乎可以通过 Visual C/C++ 实现。
结果对于所述选项将产生不同填充的结构很重要。访问结构成员的代码在处理共享数据的各种库和程序中不同,调用 未定义的行为。
因此强烈建议不要对不同编译代码段之间共享的数据结构使用不同的对齐选项。无论它们存在于不同的程序、动态库、静态链接的目标文件、用户或内核代码、设备驱动程序等中,结果都是相同的:具有潜在灾难性后果的未定义行为(与任何 UB 一样)。
它只对不兼容模块之间使用和共享的结构很重要,但随着时间的推移很难跟踪谁使用和谁不使用共享头文件中发布的结构定义。仅在本地使用且其定义不可见的结构应该不会造成问题,但只要它们保持私有即可。
如果您使用编译时开关,所有 结构将受这些影响,包括 C 库中的标准定义,以及头文件中本地或全局定义的所有结构。标准包含文件可能有规定使它们免受此类差异的影响,但您自己的结构定义不会。
除非您确切知道为什么需要这样做,否则不要使用编译时开关执行此操作。不要在源代码中这样做(通过编译指示、属性和其他不可移植的结构),除非您是真正的专家,可以完全控制数据的每次使用。
如果您关注结构包装,请重新排序struct
成员并选择其类型以实现您的目标。在 极易出错 中更改编译器的打包规则。有关完整研究,请参阅 http://www.catb.org/esr/structure-packing/。