版权声明:本文为博主原创文章,转载请注明出处。 https://blog.csdn.net/Yvken_Zh/article/details/80877352
结构体的字节大小,一个简单的结构体定义如下,这个结构的大小应是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;
}
输出: