// Dem01: Two unsigned int and one bool
struct torgle_register
{
unsigned int SN : 8; // 4 bits for SN value
unsigned int ACK : 4; // 4 bits for ACK value
bool goodIN : 1; //1 bit for goodIN
};
int main() {
using namespace std;
torgle_register one{
255,255,true
};
unsigned int a;
cout << sizeof(one);
}
输出:8
// Demo2: Two unsigned int
struct torgle_register
{
unsigned int SN : 8; // 4 bits for SN value
unsigned int ACK : 4; // 4 bits for ACK value
//bool goodIN : 1; //1 bit for goodIN
};
int main() {
using namespace std;
torgle_register one{
255,255
};
unsigned int a;
cout << sizeof(one);
}
输出:4
分析:结构体中关于位字段的内存分配,要符合“含有多个字段(field)的字(word)的大小是所有字段的类型中的最长的那个的倍数”的原则,Demo1中,三个字段包括两个无符整型和一个布尔型,最长的字段占4个字节,因此输出结果是4的倍数,Demo2同理,输出的差异在于,考虑到内存类型对齐的要求,额外的布尔型字段不因首4字节未满就存储在此,而是需要另起4个字节存储。这里用Demo3验证,调整字段的顺序,由int int bool变成 int bool int:
//Demo3:
struct torgle_register
{
unsigned int SN : 8; // 4 bits for SN value
bool goodIN : 1; //1 bit for goodIN
unsigned int ACK : 4; // 4 bits for ACK value
};
int main() {
using namespace std;
torgle_register one{
255,255
};
unsigned int a;
cout << sizeof(one);
}
输出结果为12。
综上