您的位置:首页 > 房产 > 家装 > ui培训的课程_中小企业网络解决方案_竞价推广托管开户_推荐一个seo优化软件

ui培训的课程_中小企业网络解决方案_竞价推广托管开户_推荐一个seo优化软件

2025/4/23 8:43:47 来源:https://blog.csdn.net/MengYiKeNan/article/details/147007232  浏览:    关键词:ui培训的课程_中小企业网络解决方案_竞价推广托管开户_推荐一个seo优化软件
ui培训的课程_中小企业网络解决方案_竞价推广托管开户_推荐一个seo优化软件
一、引言

C++ struct 的大小通常不会直接等于各个成员大小的总和,这是因为太过精细地分配内存会导致内存分配和访问的效率过低,所以一般对于不同大小的成员会采取对齐规则来分配内存。

结构体的地址和结构体中第一个成员的地址相同。

在 C++ 中,class 和 struct 唯一的区别就是:class 的成员默认是 private,而 struct 的成员默认是 public。摘自 《C++ prime》

二、对齐规则

结构体在对齐时,对于没有用到的空间使用空白字节填充。

规则一:结构体的成员按照定义顺序依次置于内存,每个成员按照自身大小对齐。

结构体中每个成员都有自己的大小,在对齐时成员依次置于内存。设第一个成员的偏移量为 0,则后续每个成员的偏移量都是该成员的倍数。指针类型的成员在 64 为系统下固定占 8 个字节。数组类型的成员可以视为多个基础类型的成员,数量就是数组的大小,基础类型就是数组的类型。

struct A {char c;int i;double d;
}printf("%d %d %d %d\n", sizeof(A), &A::c, &A::i, &A::d);
// 16 0 4 8
0123456789101112131415
c填充填充填充i0i1i2i3d0d1d2d3d4d5d6d7

规则二:结构体的大小必须是结构体中最大的成员大小的整数倍。

结构体的大小必须是有规则的,这样当两个相同的结构体变量放到内存时,两个结构体也是对齐的。

struct B {char c;double d;int i;
}printf("%d %d %d %d\n", sizeof(B), &B::c, &B::d, &B::i);
// 24 0 8 16
01234567891011121314151617181920212223
c填充填充填充填充填充填充填充d0d1d2d3d4d5d6d7i0i1i2i3填充填充填充填充

规则三:如果结构体中还有结构体,则内部结构体的大小可以视为内部结构体最大的成员的大小进行对齐。

如果结构体中还有结构体,内部的结构体已经对齐,可以视为一个数组,当作多个普通成员进行对齐。

struct C
{char c;struct B b;int i;
};printf("%d %d %d %d\n", sizeof(C), &C::c, &C::b, &C::i);
// 40 0 8 32
0123456789101112131415161718192021222324252627282930313233343536373839
c填充填充填充填充填充填充填充b0b1b2b3b4b5b6b7b8b9b10b11b12b13b14b15b16b17b18b19b20b21b22b23i0i1i2i3填充填充填充填充

编译器默认的对齐数是可以通过#pragma pack (n)来指定对齐数,但是修改之后不同的平台可能会不兼容。

string 的对齐规则

string 类型中的数据存放在堆中,栈中只保存一个 char* 类型和一些额外信息,使用 sizeof(string) 可以查看 string 类型占 32 字节。但是 string 在结构体中的对齐值使用 alignof(string) 可以看到是 8 字节。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com