C++中的字节对齐,以及空结构体,数组,union类型的实践
发布日期:2021-05-15 16:17:54 浏览次数:11 分类:精选文章

本文共 1521 字,大约阅读时间需要 5 分钟。

代码分析与实践

代码示例

#include 
struct 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 S2struct S3的大小差异源于成员变量的对齐方式。struct S2包含一个U1成员,U1包含long iint k[5]char c,因此每个成员变量都需要4字节对齐(long占用4字节),导致struct S2的总大小为32字节。而struct S3仅包含long bchar a,两个成员的对齐方式较为简单,因此大小为8字节。

联合体与结构体实践

#include 
typedef 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;}

结论

通过以上示例可以看出,联合体和结构体的大小计算方式存在显著差异。合理利用字节对齐和成员变量对齐方式,可以显著影响最终结构体的大小,进而优化程序内存占用。

上一篇:C++中的数组和字符串,strlen函数,iostream头文件
下一篇:cygwin下编译zlib源码

发表评论

最新留言

很好
[***.229.124.182]2025年04月15日 09时47分40秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章