内存对齐规则

编程入门 行业动态 更新时间:2024-10-28 13:14:05

<a href=https://www.elefans.com/category/jswz/34/1771154.html style=内存对齐规则"/>

内存对齐规则

前言

        求结构体的大小是很热门的考点,无论你是学C还是C++,都会遇到这样的问题,在面试中也很受欢迎,所以我们先思考这样一个问题:计算结构体,联合体和类的大小应该怎么去计算呢?我们知道,在C语言中结构体内部可以包含很多变量,所以我们在没有学习这个知识之前,会固化地认为,结构体的大小就是内部变量的大小的总和,但是事实就是这样吗?显然并不是,那接下来我们就要去学习一下如何求结构体它们的大小

一、内存对齐规则(每一个都是重点)

1. 第一个成员永远在与结构体变量偏移量为0的地址处。

2. 其他成员变量要对齐到 自身对齐数的整数倍 的地址处。

对齐数 = 编译器默认的一个对齐数该成员大小较小值

只有VS中默认对齐数值为8
其他编辑器(gcc,clang)的对齐数就是成员自身的大小

3. 结构体总大小为最大对齐数(每个成员变量都有一个对齐数)的整数倍

4. 如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。

5. 当结构体里有数组的时候,我们数组的对齐数是数组中一个元素的大小,之后在占整个数组大小的空间。

5. 使用下面的代码可以设置默认对齐数:

#include <stdio.h>
#pragma pack(8)//设置默认对齐数为8
struct S1
{char c1;int i;char c2;
};
#pragma pack()//取消设置的默认对齐数,还原为默认

二、求结构体大小的例题 (都按编辑器没有默认对齐数)

1. 例题1

#include <stdio.h>
struct S1
{char c1;int i;char c2;
};
int main()
{printf("%lu",sizeof(struct S1));return 0;
}

答案及解析 12

2. 例题2

#include <stdio.h>
struct S2
{char c1;char c2;int i;
};
int main()
{printf("%lu\n", sizeof(struct S2));return 0;
}

答案及解析 8

153. 例题3

#include <stdio.h>
struct S3
{double d;char c;int i;
};
int main()
{printf("%lu\n", sizeof(struct S3));return 0;
}

答案及解析 16

4. 例题4 (嵌套结构体)

#include <stdio.h>
struct S3
{double d;char c;int i;
};struct S4
{char c1;struct S3 s3;double d;
};
int main()
{printf("%lu\n", sizeof(struct S4));return 0;
}

答案及解析 32

5. 例题5(结构体内部有数组)

#include <stdio.h>
struct S1
{char c1;int arr[6];
};
int main()
{printf("%lu",sizeof(struct S1));return 0;
}

答案及解析 28

三、联合体的计算规则

联合体是共用同一块空间的;

1. 联合的大小至少是最大成员的大小

2. 当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍

3. 数组的对齐数是数组的一个元素的大小,再占整个数组大小的空间。

四、求union联合体大小的例题

1. 例题1


#include <stdio.h>
union Un1
{char c[5];int i;
};int main()
{printf("%lu\n", sizeof(union Un1));return 0;
}

答案及解析  8

2. 例题2

#include <stdio.h>
union Un2
{short c[7];int i;
};
int main()
{printf("%lu\n", sizeof(union Un2));    return 0;
}

答案及解析 16

五、求类大小(向结构体看齐,一样的规则哦)

更多推荐

内存对齐规则

本文发布于:2023-11-15 10:14:36,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1598006.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:内存   规则

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!