class 的位宽
Bit width of a class
有一个 class 声明为:
class Payload {
uint8_t m_a : 1;
uint8_t m_b : 5;
uint8_t m_c : 2;
uint8_t m_d : 4;
};
你看,sizeof(Payload) == 2
。到目前为止,一切都很好。总bit数为12,超过8bit,占用2Bytes
但是有没有办法获取 class 声明的位数?我的意思是 return '12'...? 一定要使算法适用于任何类型的 class 定义位域,理论上任何大小...
sizeof(Payload)*CHAR_BIT
。这将获取结构的大小(以字节为单位)并将其乘以每字节的位数(技术上并不总是 8)。这是有效的,因为包含位域的结构的位大小不能不是 CHAR_BIT
的倍数。编译器将在最后一个成员之后添加填充位。
不,不是以符合标准的方式。
the bit-field attribute is not part of the type of the class member
这意味着在编译时无法提取此信息。使用运行时内省技术查找此信息的任何尝试最多都依赖于实现定义的行为。
有一个 class 声明为:
class Payload {
uint8_t m_a : 1;
uint8_t m_b : 5;
uint8_t m_c : 2;
uint8_t m_d : 4;
};
你看,sizeof(Payload) == 2
。到目前为止,一切都很好。总bit数为12,超过8bit,占用2Bytes
但是有没有办法获取 class 声明的位数?我的意思是 return '12'...? 一定要使算法适用于任何类型的 class 定义位域,理论上任何大小...
sizeof(Payload)*CHAR_BIT
。这将获取结构的大小(以字节为单位)并将其乘以每字节的位数(技术上并不总是 8)。这是有效的,因为包含位域的结构的位大小不能不是 CHAR_BIT
的倍数。编译器将在最后一个成员之后添加填充位。
不,不是以符合标准的方式。
the bit-field attribute is not part of the type of the class member
这意味着在编译时无法提取此信息。使用运行时内省技术查找此信息的任何尝试最多都依赖于实现定义的行为。