结构体内存对齐模式

结构体的字节大小,一个简单的结构体定义如下,这个结构的大小应是8字节(32位下)

typedef struct MODEL4 {
	char c;
	int x;
}MODEL4;

char的大小是1,而int是4,但总的大小是8,这就是结构体内存对齐的原因。在32位的机器上,数据是以4字节对齐的,因为这样子,cpu访问起来会很方便。

这个结构体的内存里面的图像大概是这样的:


图中紫色部分的内存确实没有用,就是为了对齐而多申请的。


关于结构体内存对齐,下面的例子更经典 在我数据结构课的时候当时没有很好的理,要很好的理解操作系统这样的做法,一定要从内存的角度去理解。

typedef struct  MODEL{
	int x;
	char y;
	double z;
}MODEL;
// 4 + 4 + 8

typedef struct  MODEL2{
	char x;
	double y;
	int z;
}MODEL2;
// 4 + 4 + 8 + (4 + 4)

还是画成图更形象一些。

不过关于结构体的内存对齐。就是这些几点规则

1:每个数据成员存储的起始位置要从该成员大小或者成员的子成员大小(只要该成员有子成员,比如说是数组,结构体等)的整数倍开始(比如int在32位机为4字节,则要从4的整数倍地址开始存储。

2:结构体作为成员:如果一个结构里有某些结构体成员,则结构体成员要从其内部最大元素大小的整数倍地址开始存储.(struct a里存有struct b,b里有char,int ,double等元素,那b应该从8的整数倍开始存储.)

3:结构体的总大小,也就是sizeof的结果,.必须是其内部最大成员的整数倍.不足的要补齐.



这个结构体就是结构体里面有一个结构体作为成员出现

typedef struct MODEL3 {
	int x;
	MODEL2 y;
	char z;
}MODEL3;
// (4+4) + 24 + (1+7) = 40


关于内存对齐模式,计算机默认的32位是4字节对齐,c语言可以通过#pragma pack(n)对齐

#pragma pack(n)

比如#pragma pack(1) 结构体的大小就不一样了

#pragma pack(1)

#include<stdio.h>

typedef struct  MODEL{
	int x;
	char y;
	double z;
}MODEL;
// 4 + 4 + 8

typedef struct  MODEL2{
	char x;
	double y;
	int z;
}MODEL2;
// 4 + 4 + 8 + (4 + 4)

typedef struct MODEL3 {
	int x;
	MODEL2 y;
	char z;
}MODEL3;
// (4+4) + 24 + (1+7) = 40

typedef struct MODEL4 {
	char c;
	int x;
}MODEL4;


int main(void) {
	MODEL model1 = {0};
	MODEL2 model2 = {0};
	MODEL3 model3 = {0};


	printf("MODEL = %d\n", sizeof(MODEL));
	printf("MODEL2 = %d\n", sizeof(MODEL2));
	printf("MODEL3 = %d\n", sizeof(MODEL3));
	printf("MODEL4 = %d\n", sizeof(MODEL4));
	printf("model1.x = %p, model1.y = %p, model1.z = %p\n", &model1.x, &model1.y, &model1.z);
	printf("model2.x = %p, model2.y = %p, model2.z = %p\n", &model2.x, &model2.y, &model2.z);
	printf("model3.x = %p, model3.y = %p, model3.z = %p\n", &model3.x, &model3.y, &model3.z);

	return 0;
}

输出:


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值