连续零宽度未命名位域为何不改变结构体大小?
连续零宽度未命名位域的结构体大小问题
首先明确C标准里零宽度未命名位域的核心作用:它只负责强制紧随其后的位域成员对齐到下一个unsigned int的存储单元起始位置(通常unsigned int为4字节)。
先看你能理解的第一个结构体:
struct { unsigned int a : 8; unsigned int : 0; unsigned int f : 1; } A;
a占用第一个4字节单元的8位- 零宽度位域跳过该单元剩余的24位,把
f推到第二个4字节单元的起始位置 - 结构体需要容纳两个4字节单元,所以
sizeof(A)为8字节,这部分逻辑没问题。
再看添加了第二个零宽度位域的版本:
struct { unsigned int a : 8; unsigned int : 0; unsigned int : 0; unsigned int f : 1; } A;
这里第二个零宽度位域之所以没效果,是因为第一个零宽度位域已经把位置推进到第二个4字节单元的起始点了。此时第二个零宽度位域的作用是让下一个成员跳到新单元,但当前已经处于新单元的开头,没有剩余空间可跳过,所以这个操作不会产生实际效果——不会再推进到第三个4字节单元。
结果就是f依然放在第二个4字节单元里,整个结构体还是只需要两个4字节的空间,sizeof(A)仍然是8字节。
总结:连续的零宽度未命名位域不会叠加“跳单元”的效果,只有第一个会触发跳转动作,后续的因为已经处于单元起始位置,不会产生额外的空间占用。
内容的提问来源于stack exchange,提问作者user9026
相关产品推荐
相关产品推荐

