结构体的内存对齐问题

首先结构体的内存对齐问题是一个肥肠肥肠重要的问题!!
它最主要的体现就是结构体的内存占用字节大小,占用字节打下又和对齐数有着密切的关系,下来我们就来说一下结构体内存对齐的四大原则!!和我们这个对齐数到底这么一回事!!

四大原则:结构体的内存对齐问题
1.第一个成员在与结构体变量偏移量为0的地址处。
2.其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。
//对齐数 = 编译器默认的一个对齐数 与 该成员大小的较小值。(就是这个变量的字相比哪个小对齐数就是哪个,并节大小和编译器默认的这个值且这个对齐数是可以改的可以用语句改这个我们一会说,所以如果对齐数可以变的话那很明显结构体的占用字节数也是可以变的)
一些常见变量的默认字节:
int 4
char 1
double 8
short 2
long 8

一些常见的编译器的默认对齐数
VS中默认的值为8
linux中的默认值为4

3.结构体总大小为最大对齐数(每个成员变量除了第一个成员都有一个对齐数)的整数倍。
4.如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。

我们来举个栗子(在vs2013下)

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>

struct A//定义一个结构体A
{
int a;
char b;
double c;
};
int main()
{
printf("%d",sizeof(struct A));//求这个结构体的占用内存数
system("pause");
return 0;
}
//输出结构为16

那么为啥是16呢我们画个图看一下
这个图的一个框框代表一个字节,写1的地方就是被占用的的地方,写0的就是没有被占用的
很明显我们这个结构体的最大对齐数为8,所以我们这个结构体的大小则为16
这里写图片描述
那如果是四字节对齐的话
这里写图片描述

那很明显对齐数对齐数我们在画完图之后就看的很清楚了

然后我们再来看一个题:结构体内包含结构体的问题
结构体内包含结构体的问题我们其实只要知道一点就可以了那就是结构体的对齐数是其内部成员的最大对齐数!!
那么结构体A的对齐数(在vs2013下)则为8

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>

struct A
{
int a;
char b;
double c;
};

struct B//定义了另一个结构体B
{
int aa;
short bb;
struct A;
};
int main()
{
printf("%d\n", sizeof(struct A));
printf("%d\n", sizeof(struct B));
system("pause");
return 0;
}

//结构体B的大小为24

那么我们就可以知道结构体B的大小则为最大对齐数8的整数倍,但是我们知道结构体A的大小为16个字节所以整个结构体B的大小则为16+8=24字节
然后我们来说一下怎么使用语句去改编译器的对齐数,肥肠简单的

#pragam pack(对齐数)

但是一般来说编译器的对齐数原则上只能由大调小不可以 由小调大!!
然后若是要取消当前对齐数的设置将其恢复到默认状态的话可以这样

#pragma 

猜你喜欢

转载自blog.csdn.net/qq_36767247/article/details/78767504