
C++中的字节对齐,以及空结构体,数组,union类型的实践
发布日期:2021-05-15 16:17:54
浏览次数:11
分类:精选文章
本文共 1521 字,大约阅读时间需要 5 分钟。
代码分析与实践
代码示例
#includestruct S {};struct S1 { char a; long b;};struct S2 { char c; struct S1 d; long long e;};struct S3 { long b; char a;};int main(void) { printf("sizeof(char) = %d\n", sizeof(char)); // 1 printf("sizeof(long) = %d\n", sizeof(long)); // 4 printf("sizeof(long long) = %d\n", sizeof(long long)); // 8 printf("struct S = %d\n", sizeof(struct S)); // 1 printf("struct S1 = %d\n", sizeof(struct S1)); // 8 printf("struct S2 = %d\n", sizeof(struct S2)); // 24 printf("struct S3 = %d\n", sizeof(struct S3)); // 8 while(1);}
提示与解释
字节对齐是C语言中结构体和联合体的重要概念。对于每个成员变量,系统会自动对齐到字节的倍数,以确保内存布局的效率。此外,空结构体的大小始终为1,类似于空类的实现。
结构体对齐示例
在代码中,struct S2
和struct S3
的大小差异源于成员变量的对齐方式。struct S2
包含一个U1
成员,U1
包含long i
、int k[5]
和char c
,因此每个成员变量都需要4字节对齐(long
占用4字节),导致struct S2
的总大小为32字节。而struct S3
仅包含long b
和char a
,两个成员的对齐方式较为简单,因此大小为8字节。
联合体与结构体实践
#includetypedef union { long i; int k[5]; char c;} U1;struct S1 { int cat; double dog;};struct S2 { int cat; U1 cow; double dog;};struct S3 { int cat; double dog; U1 cow;};class A {};int main() { printf(" sizeof(U1) = %d\n", sizeof(U1)); // 20 printf(" sizeof(struct S1) = %d\n", sizeof(struct S1)); // 16 printf(" sizeof(struct S2) = %d\n", sizeof(struct S2)); // 32 printf(" sizeof(struct S3) = %d\n", sizeof(struct S3)); // 40 printf(" sizeof(A) = %d\n", sizeof(A)); // 1 while(1); return 0;}
结论
通过以上示例可以看出,联合体和结构体的大小计算方式存在显著差异。合理利用字节对齐和成员变量对齐方式,可以显著影响最终结构体的大小,进而优化程序内存占用。
发表评论
最新留言
很好
[***.229.124.182]2025年04月15日 09时47分40秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Vector 实现类
2019-03-11
HashMap类、HashSet
2019-03-11
HashTable类
2019-03-11
TreeSet、TreeMap
2019-03-11
ObjectInputStream、ObjectOutputStream
2019-03-11
JVM内存模型
2019-03-11
反射机制
2019-03-11
可变长度参数
2019-03-11
堆空间常用参数总结
2019-03-11
3、条件查询
2019-03-11
8、子查询
2019-03-11
cordova打包apk更改图标
2019-03-11
开启与配置SMTP服务器
2019-03-11
APP卡片式设计
2019-03-11
GitHub上传时,项目在已有文档时直接push出现错误解决方案
2019-03-11
云数据库
2019-03-11
大数据在不同领域的应用
2019-03-11
页面置换算法
2019-03-11
文件系统的层次结构
2019-03-11
减少磁盘延迟时间的方法
2019-03-11