我有按位 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/