android - 按位结构的大小错误

标签 android c++ iphone struct ios-simulator

我有按位 C++ 结构:

struct MXBodyStateCompact {
    uint8_t angle : 8;
    uint16_t positionX : 16;
    uint16_t positionY : 16;

    void Set(MXBodyState state);
    void GetState(MXBodyState *state);
};

它在 iPhone 上完美运行 – 每个实例 5 个字节。正是我所需要的。

但是在 iOS Simulator 和 Android 上遇到了麻烦。每个实例分配 6 个字节。虽然 angle 仍然是 1 个字节长(根据 sizeof),但它在内存中占用了 2 个字节:

(gdb) p sizeof(*this)
$4 = 6
(gdb) p sizeof(this->angle)
$5 = 1
(gdb) p sizeof(this->positionX)
$6 = 2
(gdb) p sizeof(this->positionY)
$7 = 2
(gdb) p this
$8 = (struct MXBodyStateCompact *) 0x7ee5d035
(gdb) p &this->angle
$9 = (uint8_t *) 0x7ee5d035 "X"
(gdb) p &this->positionX
$10 = (uint16_t *) 0x7ee5d037
(gdb) p &this->positionY
$11 = (uint16_t *) 0x7ee5d039

可以看到,angle的地址和positionX的地址之间有2个字节。

有没有办法强制编译器/系统遵守结构字段的大小?或者需要找到其他方式来处理我的二进制文件? (我使用这个结构来处理二进制文件中的数据。)

最佳答案

使用 __attribute__((packed)) 告诉 gcc 或 clang 不要在此结构的成员之间插入填充。

struct __attribute__((packed)) MXBodyStateCompact {
    uint8_t angle : 8;
    uint16_t positionX : 16;
    uint16_t positionY : 16;

    void Set(MXBodyState state);
    void GetState(MXBodyState *state);
}

此外,: 8: 16 似乎是不必要的。

关于android - 按位结构的大小错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21976216/

相关文章:

android - 在Android中,如何重新布局 View ?

java - 从资源中解析 XML 文件

c++ - 使用 cin 获取类的枚举类型

c++ - 在结构中初始化一个 vector

ios - 无法为自定义栏按钮设置标题?

iphone - 此代码是否适用于iTunes购买的AAC格式?

java - MobileAds.initialize(Context, String) 已弃用

c++ - Visual Studio 无法加载一堆 dll

iphone - 以编程方式检测 iPhone 是否掉在地上

android - 我想在应用程序运行时更改应用程序的方向(仅适用于某些页面纵向和其他横向页面)