You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

连续零宽度未命名位域为何不改变结构体大小?

连续零宽度未命名位域的结构体大小问题

首先明确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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 12:52:54