联合中位域的 VStudio C++ 对齐
VStudio c++ alignment of bitfield in union
在 VStudio 2010 中,我试图创建一个联合来方便地访问 2 字节值:
#pragma pack(push,1) // disable padding
typedef struct {
uint8_t r:3;
uint8_t g:3;
uint8_t b:3;
}tsRgb;
typedef union {
uint16_t raw;
tsRgb rgb;
}tPixelData;
#pragma pack(pop)
int main(){
tPixelData pixel;
pixel.raw = 0xABE5;
return 0;
}
我期待 pixel.r = 5,pixel.g = 4,pixel.b = 7。
r 和 g 没问题,但 b 是 3.
我做错了什么?我假设我没有正确对齐位?
第三个字段将在一个单独的字节中。
在VC++中,位域不跨越基础类型的边界。当您使用了 3+3 位时,只剩下 2 位,因此下一个字段将使用新字节中的 3 位。
如果使用 uint16_t
而不是 uint8_t
可能会更好。
"Disable padding" 工作在字节级别,而不是位级别。
如你所愿地使用位域从根本上是有问题的。根据 the C Standard、6.7.2.1 结构和联合说明符,第 11 段(因为您的问题也被标记为 C):
An implementation may allocate any addressable storage unit large
enough to hold a bit- field. If enough space remains, a bit-field
that immediately follows another bit-field in a structure shall be
packed into adjacent bits of the same unit. If insufficient space
remains, whether a bit-field that does not fit is put into
the next unit or overlaps adjacent units is
implementation-defined. The order of allocation of bit-fields within
a unit (high-order to low-order or low-order to high-order) is
implementation-defined. The alignment of the addressable storage
unit is unspecified.
位域中位的布局和对齐方式都是实现定义的。字段可能会也可能不会跨越存储单元边界,它们可以按任何顺序存储。
它们根本不便携。
在 VStudio 2010 中,我试图创建一个联合来方便地访问 2 字节值:
#pragma pack(push,1) // disable padding
typedef struct {
uint8_t r:3;
uint8_t g:3;
uint8_t b:3;
}tsRgb;
typedef union {
uint16_t raw;
tsRgb rgb;
}tPixelData;
#pragma pack(pop)
int main(){
tPixelData pixel;
pixel.raw = 0xABE5;
return 0;
}
我期待 pixel.r = 5,pixel.g = 4,pixel.b = 7。 r 和 g 没问题,但 b 是 3.
我做错了什么?我假设我没有正确对齐位?
第三个字段将在一个单独的字节中。
在VC++中,位域不跨越基础类型的边界。当您使用了 3+3 位时,只剩下 2 位,因此下一个字段将使用新字节中的 3 位。
如果使用 uint16_t
而不是 uint8_t
可能会更好。
"Disable padding" 工作在字节级别,而不是位级别。
如你所愿地使用位域从根本上是有问题的。根据 the C Standard、6.7.2.1 结构和联合说明符,第 11 段(因为您的问题也被标记为 C):
An implementation may allocate any addressable storage unit large enough to hold a bit- field. If enough space remains, a bit-field that immediately follows another bit-field in a structure shall be packed into adjacent bits of the same unit. If insufficient space remains, whether a bit-field that does not fit is put into the next unit or overlaps adjacent units is implementation-defined. The order of allocation of bit-fields within a unit (high-order to low-order or low-order to high-order) is implementation-defined. The alignment of the addressable storage unit is unspecified.
位域中位的布局和对齐方式都是实现定义的。字段可能会也可能不会跨越存储单元边界,它们可以按任何顺序存储。
它们根本不便携。