关于android:Clang和Visual C ++结构对齐兼容性问题

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将忽略属性,因此我将两者都放在了代码中。 您可能会使用例如 grepsed可以防止很多手动工作。