【发布时间】:2016-11-23 05:27:11
【问题描述】:
我们在结构内存打包和对齐方面遇到问题。
Android 不尊重我们代码库中数百个位置的#pragma pack(push,
Android Clang 编译器要求结构或类上有一个 __ 属性 __ 装饰器,例如:
struct __attribute__((packed, aligned(8))) Test
{
char a;
char b;
double d;
};
与尊重编译指示的 Visual C++ 不同:
#pragma pack(push, 8)
struct Test
{
char a;
char b;
double d;
};
#pragma pack(pop)
由于#pragma pack 的使用如此广泛,修复将是一项耗时的任务。
我们尝试使用 -mms-bitfields 编译器标志,它将默认结构布局设置为与 Microsoft 编译器标准兼容(即它遵循 #pragma 包)。但是,这仅适用于普通结构,不适用于具有基类或虚函数的类。对于这些类型的类,我们会收到以下错误。
“错误:ms_struct 可能无法为具有基类或虚函数的类生成 Microsoft 兼容的布局 [-Wincompatible-ms-struct]”
我们如何才能缓解这个问题 - 除了遍历 push 和 pop pragma 之间的所有类/结构并添加 packed 属性之外,是否有任何解决方法可以使 #pragma pack 对非平凡的结构/类起作用?
谢谢
【问题讨论】:
标签: android c++ visual-c++ struct clang