我们遇到了结构内存打包和对齐问题。
Android并未尊重#pragma pack(push,< n>),它在我们的代码库中已有数百个位置。这是导致段错误的原因。
Android Clang编译器在结构或类上需要__ attribute __ decorator,例如:
struct __attribute__((packed, aligned(8))) Test
{
char a;
char b;
double d;
};
与支持pragma的Visual C ++相反:
#pragma pack(push, 8)
struct Test
{
char a;
char b;
double d;
};
#pragma pack(pop)
由于#pragma pack的使用非常普遍,因此修复它将是一项非常耗时的任务。
我们尝试使用-mms-bitfields编译器标志,该标志将默认结构布局设置为与Microsoft编译器标准兼容(即它尊重#pragma pack)。但是,这仅适用于简单的结构,而不适用于具有基类或虚函数的类。我们在这些类中遇到以下错误。
“错误:ms_struct可能无法为具有基类或虚函数的类生成与Microsoft兼容的布局[-Wincompatible-ms-struct]”
我们如何缓解这个问题 - 是否有任何解决方法使#pragma pack适用于非平凡的结构/类,而不是遍历push和pop pragma之间的所有类/结构并添加packed属性?
由于
答案 0 :(得分:2)
首先,我的印象是,当你的代码中有“几百个地方”时,你正在做一些根本错误的事情,你需要定义对齐以防止出现段错误。该pragma是非标准的,并且使用它并不普遍。最值得注意的是,使用它并不像你那样广泛使用。它也不符合标准。
无论如何,因为clang会忽略pragma而msvcc会忽略这些属性,所以我将两者放在代码中。您可以使用例如grep
和sed
以防止大量手动工作。