sizeof未显示预期输出 #包括 #包括 typedef联合{ uint64_t u[2]; 结构{ uint64_t a:30; uint64_t b:30; uint64_t c:30; uint64_t d:30; uint64_t e:8; }x; }我的结构; int main() { printf(“大小%d\n”,大小为(mystruct)); }
我试图在64位机器上编译它。预期的输出是16,但我得到24。 我知道这里发生了一些对齐,但我不确定为什么,因为结构x正好是16字节。 有人能解释一下吗。 感谢来自C标准的: (C99,6.7.2.1p10)“[…]如果剩余空间不足, 是否将不适合的位字段放入下一个单元或与相邻单元重叠是不确定的 已定义实现。”sizeof未显示预期输出 #包括 #包括 typedef联合{ uint64_t u[2]; 结构{ uint64_t a:30; uint64_t b:30; uint64_t c:30; uint64_t d:30; uint64_t e:8; }x; }我的结构; int main() { printf(“大小%d\n”,大小为(mystruct)); },c,structure,sizeof,bit-fields,C,Structure,Sizeof,Bit Fields,我试图在64位机器上编译它。预期的输出是16,但我得到24。 我知道这里发生了一些对齐,但我不确定为什么,因为结构x正好是16字节。 有人能解释一下吗。 感谢来自C标准的: (C99,6.7.2.1p10)“[…]如果剩余空间不足, 是否将不适合的位字段放入下一个单元或与相邻单元重叠是不确定的 已定义实现。” 因此在您的实现中,它们不会重叠:a和b成员在一个单元中,c和d在另一个单元中,e在另一个单元中:8+8=24对于64位机器,字段a和b使用结构中第一个64位值的60位,c和d使用结构中下一
因此在您的实现中,它们不会重叠:
a
和b
成员在一个单元中,c
和d
在另一个单元中,e
在另一个单元中:8+8=24
对于64位机器,字段a
和b
使用结构中第一个64位值的60位,c
和d
使用结构中下一个64位值的60位,然后因为e
是8位,它无法放入该64位值剩余的4位,因此需要另一个64位值。因此8x3=24字节。位字段的一个元素永远不会与两个内存“单元”重叠(在您的情况下,内存单元是64位元素)
除了位域实现依赖于编译器这一事实之外,位域结构很可能以以下方式存储在内存中:
#include <stdint.h>
#include <stdio.h>
typedef union {
uint64_t u[2];
struct {
uint64_t a:30;
uint64_t b:30;
uint64_t c:30;
uint64_t d:30;
uint64_t e:8;
}x;
} mystruct;
int main()
{
printf("Size %d\n", sizeof(mystruct));
}
您正在使用位字段:K&R第150页:“几乎所有关于位字段的内容都依赖于实现”。就我个人而言,我会省略“几乎”这个词。@cdark他们说几乎是因为其余的都没有具体说明;)
struct {
uint64_t a:30;
uint64_t b:30;
uint64_t :4;
uint64_t c:30;
uint64_t d:30;
uint64_t :4;
uint64_t e:8;
uint64_t :56;
}x;