结构体的内存对齐(内存大小)--超级容易理解,结合图形,轻松掌握
2022/1/31 7:04:29
本文主要是介绍结构体的内存对齐(内存大小)--超级容易理解,结合图形,轻松掌握,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
不重要的内容:我只是一名大一学生,还有很多的不足。这些文章只是我的学习笔记,谈不上知识原创分享。如文章内容有知识性错误欢迎指出;如果您觉得排版有问题,影响阅读,也可指出,欢迎你的阅读和评论,,谢谢。文末留有我的博客,会不定期更新,一起进步,一起优秀呀。(因为该内容转载自我的博客,所以没有添加一些好玩的表情包)
Data | 16位 | 32位 | 64位 |
---|---|---|---|
char | 1 byte | 1 byte | 1 byte |
int | 2 bytes | 4 bytes | 4 bytes |
float | 4 bytes | 4 bytes | 4 bytes |
double | 8 bytes | 8 bytes | 8 bytes |
long | 4 bytes | 4 bytes | 8 bytes |
short | 2bytes | 2bytes |
字节对齐的细节和编译器实现相关,一般而言有3个准则。
-
结构体变量的首地址能够被其最宽基本类型成员的大小所整除。
-
结构体每个成员相对于结构体首地址的偏移量(offset)都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节(Internal Adding)。
-
结构体的总大小为结构体最大基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节(Trailing Padding)。
(1)例1:简单体验
struct name { char b; int a; };//内存大小为1+4+3=8由准则3易得,1+4并不是该结构体中最大字节的数据类型(int)的倍数,因此要补3位,如下图
例1:原理图:
(2)例2:数据类型的顺序对结构体内存大小的影响
struct name { char a; char b; int c; };//内存大小为1+1+4(+2)=8,同样是由准则3得到;
例2:原理图
例3:
struct name { char a; int b; char c; };//原理如下图:内存空间为1+4(+3)+1(+3)=12;这是由准则2和3得到的。分配完char和int后所占字节为5不是最大字节的数据类型(int)的整数倍,所以要补位+3,最后一个补位+3同理
例3:原理图:
很显然,数据类型的排列的顺序不同也会影响到结构体的内存空间
例4:
struct student { char a; double b; int c; }; //原理图如下:内存空间为1+8(+7)+1(+7)=24
例4:原理图
例5:带有数组的结构体
struct student { char a[10]; double b; int c; };//内存大小32字节·
注意:最大的基本类型double b而不是char a[10]
例5:原理图
例6:
struct student { int a[9]; double b; char c; };//数组
例6:原理图
#pragma pack(n) n为整数
- n 就相当于上面的最大数据类型的字节
欢迎访问我的博客Super如有不足,欢迎指出,谢谢
这篇关于结构体的内存对齐(内存大小)--超级容易理解,结合图形,轻松掌握的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-06-26结对编程到底难不难?答案在这里
- 2024-06-19《2023版Java工程师》课程升级公告
- 2024-06-15matplotlib作图不显示3D图,怎么办?
- 2024-06-1503-Loki 日志监控
- 2024-06-1504-让LLM理解知识 -Prompt
- 2024-06-05做软件测试需要懂代码吗?
- 2024-06-0514-ShardingSphere的分布式主键实现
- 2024-06-03为什么以及如何要进行架构设计权衡?
- 2024-05-31全网首发第二弹!软考2024年5月《软件设计师》真题+解析+答案!(11-20题)
- 2024-05-31全网首发!软考2024年5月《软件设计师》真题+解析+答案!(21-30题)