|
发表于 2024-1-2 20:22:35
|
显示全部楼层
本楼为最佳答案
本帖最后由 jackz007 于 2024-1-2 21:26 编辑
- #include <stdio.h>
- int main(void)
- {
- struct A {
- int a ; // a 从偏移 0 的位置开始,正常占用 4 个字节
- char b ; // b 从偏移为 4 的位置开始,占用 1 个字节
- short c ; // c 本应从偏移 5 的位置开始,但是,由于 c 占用 2 个字节,必须从 2 的整数倍偏移位置开始,所以,c 从偏移为 6 的位置开始,占用 2 个字节
- } ; // struct A 一共需要占用 8 个字节
- struct B {
- int a ; // a 从偏移 0 的位置开始,正常占用 4 个字节
- char b[10] ; // b 从偏移为 4 的位置开始,占用 10 个字节
- short c ; // c 从偏移为 14 的位置开始,占用 2 个字节
- } ; // struct B 一共需要占用 16 个字节
- printf("the sizeof(struct A) is %d\n" , sizeof(struct A)) ;
- printf("the sizeof(struct B) is %d\n" , sizeof(struct B)) ;
- }
复制代码
更加有意思的是,一模一样的两个结构,仅仅因为成员顺序不同,从而导致占用空间存在较大差异:
- #include <stdio.h>
- int main(void)
- {
- struct A {
- char a ; // a 从偏移 0 的位置开始,正常占用 1 个字节
- long long b ; // b 本应从偏移为 1 的位置开始,由于 b 需要占用 8 个字节,需要从 8 字节对齐的位置开始,所以,b 从偏移 8 开始,占用 8 个字节
- short c ; // c 从偏移为 16 的位置开始,占用 2 个字节
- int d ; // d 本应从偏移为 18 的位置开始,但是,由于 d 占用 4 个字节,需要从 4 字节对齐的位置开始,所以,d 从偏移 20 开始,占用 4 个字节
- } ; // struct A 一共需要占用 24 个字节
- struct B {
- char a ; // a 从偏移为 0 的位置开始,正常占用 1 个字节
- short c ; // c 本应从偏移为 1 的位置开始,由于 c 需要占用 2 个字节,需要从 2 字节对齐的位置开始,所以,c 从偏移 2 开始,占用 2 个字节
- int d ; // d 从偏移为 4 的位置开始,占用 4 个字节
- long long b ; // b 从偏移为 8 的位置开始,占用 8 个字节
- } ; // struct B 一共需要占用 16 个字节
- printf("the sizeof(struct A) is %d\n" , sizeof(struct A)) ;
- printf("the sizeof(struct B) is %d\n" , sizeof(struct B)) ;
- }
复制代码
而所有这一切,都是因为边界对齐所致。
|
|