1.结构体非空问题
结构体在C语言里不允许是空的(但是在C++允许,而且是一字节大小)。一般情况下都说在C++里结构体和类没什么区别,但是在网上搜一下,发现深究还是有区别的(结构体与类区别优秀博客点击这里)。
2.求解结构体大小问题
1.先确定实际对其单位。
CPU周期、结构体最大成员、预编译指令(#pragma pack(n)手动设置n,只能填1 2 4 8 16)三者中最小的为实际对齐单位。
一般32位系统默认4字节对齐,64位系统默认8字节对齐。
2.除去结构体第一个成员外,其他所有成员的地址相对于结构体地址(第一个成员地址)的偏移量必须为实际内存对齐单位或自身大小的整数倍(取两者中较小的为基准)。
3.结构体整体大小必须是实际对齐单位的整数倍。
我们下面用示例说明:
#include<stdio.h>
//系统32位
struct S
{
char a;
short b;
};//4 short地址偏移要是2的倍数,所以和char之间空一字节,总共4字节
struct A
{
char a;//1+3
int b;//4
};//8 int地址偏移要是4的倍数,所以和char之间空3字节
struct B
{
char a;//1+1
short b;//2
int c;//4
};//8 short地址偏移是2的倍数,所以和char之间空1字节,int地址偏移是4的倍数,前面char和short正好4字节,不需要空字节
struct C
{
char a;//1+3
int b;//4
float c;//4+4
double d;//8
};//24 char放过后,int地址偏移要是4的倍数,char会空三字节,后面double8字节,起始地址偏移要是8的倍数,所以前面占12字节,所以空出来4字节
struct D
{
char a;//1+3
int b;//4
short c;//2
};//10+2 int4字节,起始地址偏移要是4的倍数,所以和char空3个字节,short地址偏移要是2的倍数,前面占8字节,不需要空字节
struct E
{
int a;//4
char b;//1
};//5+3 int4字节,char1字节,不需要和int之间有空字节,但是由于整个结构体要是实际对齐单位(4)的整数倍,所以char后空3字节
struct F
{
char a;
struct FF
{
char b;
double c;
};//16
int d;
};//32 FF的成员b和c之间空7个字节,b地址偏移量是结构体FF中成员最大的整数倍,所以a后面空了7字节,
//最终需要是变量最大(double)的整数倍,所以int后空4字节
struct F2
{
char a;
double b;
double c;
int d;
};//32
struct G
{
char a;
char b;
char c;
int d;
};// 8 前三个字节正常放,不需要空字节,但是int地址偏移需要是4的倍数,所以和第三个char后面有一个空字节
int main()
{
printf("S大小:%d\n", sizeof(struct S));
printf("A大小:%d\n", sizeof(struct A));
printf("B大小:%d\n", sizeof(struct B));
printf("C大小:%d\n", sizeof(struct C));
printf("D大小:%d\n", sizeof(struct D));
printf("E大小:%d\n", sizeof(struct E));
printf("F大小:%d\n", sizeof(struct F));
printf("F2大小:%d\n", sizeof(struct F2));
printf("G大小:%d\n", sizeof(struct G));
return 0;
}