Clang and Visual C++ struct alignment compatibility issues
我们在结构存储器打包和对齐方面遇到问题。
Android不尊重#pragma pack(push,
Android Clang编译器在结构或类上需要__属性__装饰器,例如:
1 2 3 4 5 6 | struct __attribute__((packed, aligned(8))) Test { char a; char b; double d; }; |
与Visual C ++相比,它符合实用主义的情况:
1 2 3 4 5 6 7 8 | #pragma pack(push, 8) struct Test { char a; char b; double d; }; #pragma pack(pop) |
由于#pragma pack的使用非常广泛,因此修复将是一项耗时的任务。
我们尝试使用-mms-bitfields编译器标志,该标志将默认结构布局设置为与Microsoft编译器标准兼容(即它遵循#pragma包)。但是,这仅适用于琐碎的结构,不适用于具有基类或虚函数的类。这些类型的类会出现以下错误。
"错误:ms_struct可能无法为具有基类或虚函数[-Wincompatible-ms-struct]的类生成Microsoft兼容的布局"
我们如何减轻这个问题-除了在push和pop编译指示之间遍历所有类/结构并添加packed属性之外,是否有其他解决方法可让#pragma pack适用于非平凡的结构/类?
谢谢
首先,我的印象是,当您的代码中有"数百个位置"时,您需要做一些根本上错误的事情,需要在其中定义对齐方式以防止出现段错误。 此实用程序是非标准的,使用起来并不广泛。 最明显的是,使用它的程度不如您广泛。 它也不在标准中。
无论如何,由于clang将忽略编译指示而msvcc将忽略属性,因此我将两者都放在了代码中。 您可能会使用例如