栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C语言中的内存对齐原则

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C语言中的内存对齐原则

内存对齐原则:

        (1)当前成员变量之前的总容量必须为此变量大小的整倍数。

        (2)整个结构体的总容量必须为最大成员变量的整数倍。

也就是说我们在分配内存时(自己的理解):

        ①首先在给当前成员变量分配内存空间时,应观察之前的内存空间是否为此变量大小的整倍数,其实基本上只要看前边的内存空间放下此变量后,是否会超出四个字节。

        ②最终放入最后一个变量时,我们要使得总容量为最大成员变量的整数倍,如果不够最大成员的整数倍,我们需要进行补齐。也就是说最大成员的整数倍的大小与当前内存大小最接近的数据即为内存空间大小。

例题:

struct _THUNDER {
    int iVersion;
    char cTag;
    char cAdv;
    int iUser;
    char cEnd;
} Nowcoder;
int sz = sizeof(Nowcoder);

解析:

内存对齐的规则:
1.第一个成员必须是从0位置开始偏移
2.后面的成员从成员的大小和对齐模数相比取小的整数倍的的地方(对齐模数默认是 8)
3.最后要对结构体整体进行对齐:成员中最大的那一个和对齐模数相比取小的整数倍
这里结构体具体的每个成员所在位置:
int iVersion;  0 ~ 3    因为此时为int型占据四个字节
char cTag;    4 ~ 4    此时char占据一个字节,而前边的字节刚好是当前变量char一个字节的整数倍
char cAdv;    5 ~ 5    此时char占据一个字节,而前边的字节刚好是当前变量char一个字节的整数倍

6-7:为当前补齐的内存
int iUser;     8 ~ 11    此时int占据四个字节,而前边的字节为6个,应当为4个字节的整数倍,所以应补齐8个字节,也就是到7,此时占据0-7,之后当前变量int占据四个字节,8-11。
char cEnd;  12 ~ 12  此时char占据一个字节,而前边的字节刚好是当前变量char一个字节的整数倍。最终占据13个字节,应该为所有成员变量中最大的成员变量的整数倍,也就是4个字节的整数倍,占据16个字节。

13-15:为最终补齐的内存

最后末尾 13 ~ 15 补 3 个字节,一共是 16 个字节。

内存图如下:

0123456789101112131415

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1011656.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号