gpt4 book ai didi

android - Clang 和 Visual C++ 结构对齐兼容性问题

转载 作者:行者123 更新时间:2023-11-30 03:36:20 27 4
gpt4 key购买 nike

我们遇到了结构内存打包和对齐问题。

Android 不支持我们代码库中数百处的#pragma pack(push, )。这是导致段错误的原因。

Android Clang 编译器需要结构或类上的 __ 属性 __ 装饰器,例如:

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]”

我们如何缓解这个问题 - 除了遍历 push 和 pop pragmas 之间的所有类/结构并添加 packed 属性之外,是否有任何解决方法可以使 #pragma pack 适用于重要的结构/类?

谢谢

最佳答案

首先,我的印象是,当您的代码中有“数百个位置”时,您需要定义对齐以防止出现段错误,这从根本上来说是错误的。这个 pragma 是非标准的,使用起来并不广泛。最值得注意的是,它并不像您那样广泛使用。它也不在标准中。

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

关于android - Clang 和 Visual C++ 结构对齐兼容性问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40756694/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com