【问题标题】:Clang and Visual C++ struct alignment compatibility issuesClang 和 Visual C++ 结构对齐兼容性问题
【发布时间】: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


    【解决方案1】:

    首先,我的印象是,当您的代码中有“数百个位置”时,您需要在其中定义对齐以防止段错误。这个 pragma 是非标准的,并且没有被广泛使用。最值得注意的是,像您一样广泛使用它并不普遍。它也不在标准中。

    无论如何,由于 clang 会忽略 pragma 而 msvcc 会忽略属性,所以我会将两者都放在代码中。您可以使用例如grepsed 以防止大量手动工作。

    【讨论】:

    • 这是一个非常长寿的代码库,所以我想这样的事情一定会发生,是的,我收集了 grep/sed 或专用脚本可能是要走的路。谢谢,让我们看看有没有其他人遇到过这样的问题,也许还有其他建议。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-29
    • 1970-01-01
    • 2012-05-02
    • 1970-01-01
    • 2015-05-17
    • 1970-01-01
    相关资源
    最近更新 更多