C/C++中结构体struct占用内存大小的计算方法
两个值:
- 对齐系数:一般为8个字节。
#pragma pack(8)
设置对齐系数为8。 - 有效对齐值:假设结构体中最长的类型的长度为len,则
有效对齐值=min(len,对齐系数)
。
计算规则:
- 计算存放的位置:第一个成员放在位置0,后面的成员A存放的时候,会先计算size=min(A大小, 有效对齐值),A只放在size的整数倍的位置。
- 结构体作为成员:size大小为结构体成员的有效对齐值。
- 结构体的总大小,必须是其有效对齐值的整数倍,不足的要补齐。
内存对齐的目的是为了内存对齐,减少访存操作。
#include <stdio.h>
#pragma pack(8)
int main()
{
struct Test
{
int a;
//long double大小为16bytes
long double b;
char c[10];
};
printf("%d", sizeof(Test)); // 8+8+8+10=34 34不是8的倍数,所以为40
return 0;
}
#include <stdio.h>
#pragma pack(16)
int main()
{
struct Test
{
int a;
//long double大小为16bytes
long double b;
char c[10];
};
printf("%d", sizeof(Test)); // 16+16+10=42 42不是16的倍数,所以为48
return 0;
}
#include <stdio.h>
int main()
{
struct b
{
double y;
char x;
};
struct a
{
int c;
char x;
b b1;
};
printf("%d", sizeof(a)); // 4+4+8+1 = 17 --> 24
return 0;
}
#include <stdio.h>
int main()
{
typedef struct a
{
int c;
double d;
char b[10];
}test;
test e;
printf("%d", sizeof(test)); // 32
return 0;
}
#include <stdio.h>
int main()
{
typedef struct a
{
double d;
int c;
char b[10];
}test;
test e;
printf("%d", sizeof(test)); // 24
return 0;
}