ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

结构体的内存对齐(内存大小)--超级容易理解,结合图形,轻松掌握

2022-01-30 23:03:46  阅读:185  来源: 互联网

标签:字节 -- 原理图 内存大小 char int 对齐 struct


不重要的内容:我只是一名大一学生,还有很多的不足。这些文章只是我的学习笔记,谈不上知识原创分享。如文章内容有知识性错误欢迎指出;如果您觉得排版有问题,影响阅读,也可指出,欢迎你的阅读和评论,,谢谢。文末留有我的博客,会不定期更新,一起进步,一起优秀呀。(因为该内容转载自我的博客,所以没有添加一些好玩的表情包)

Data16位32位64位
char1 byte1 byte1 byte
int2 bytes4 bytes4 bytes
float4 bytes4 bytes4 bytes
double8 bytes8 bytes8 bytes
long4 bytes4 bytes8 bytes
short2bytes2bytes

字节对齐的细节和编译器实现相关,一般而言有3个准则。

  1. 结构体变量的首地址能够被其最宽基本类型成员的大小所整除。

  2. 结构体每个成员相对于结构体首地址的偏移量(offset)都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节(Internal Adding)。

  3. 结构体的总大小为结构体最大基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节(Trailing Padding)。

(1)例1:简单体验

struct name
{
    char b;
    int a;
};//内存大小为1+4+3=8由准则3易得,1+4并不是该结构体中最大字节的数据类型(int)的倍数,因此要补3位,如下图

例1:原理图:

image-20220127201127209

(2)例2:数据类型的顺序对结构体内存大小的影响

struct name
{
    char a;
    char b;
    int c;
};//内存大小为1+1+4(+2)=8,同样是由准则3得到;

例2:原理图

image-20220127201435270

例3:

struct name
{
    char a;
    int b;
    char c;
};//原理如下图:内存空间为1+4(+3)+1(+3)=12;这是由准则2和3得到的。分配完char和int后所占字节为5不是最大字节的数据类型(int)的整数倍,所以要补位+3,最后一个补位+3同理

例3:原理图:

image-20220127202255741

很显然,数据类型的排列的顺序不同也会影响到结构体的内存空间

例4:

struct student
{
    char a;
    double b;
    int c;
};
//原理图如下:内存空间为1+8(+7)+1(+7)=24

例4:原理图

image-20220127204355885

例5:带有数组的结构体

struct student
{
    char a[10];
    double b;
    int c;
};//内存大小32字节·

注意:最大的基本类型double b而不是char a[10]

例5:原理图

image-20220128195544671

例6:

struct student
{
    int a[9];
    double b;
    char c;
};//数组

例6:原理图

image-20220128204325287

#pragma pack(n) n为整数

  • n 就相当于上面的最大数据类型的字节

欢迎访问我的博客Super如有不足,欢迎指出,谢谢

标签:字节,--,原理图,内存大小,char,int,对齐,struct
来源: https://blog.csdn.net/Che_ng/article/details/122756759

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有