
计算结构尺寸的三个原则:
首先,结构变量的首地址必须是该结构“最基本类型成员”大小的整数倍(0被认为是任何数字的整数倍).
第二,该结构的每个成员相对于该结构的第一个地址的偏移量是该成员的整数倍.
三,结构的总大小是该结构的“最宽的基本类型成员”的大小的整数倍(嵌套结构中的基本类型也被计算为得到最宽的基本类型).
个人了解最广泛的基本类型成员: 它是指字节数最多的类型成员. 下表是检查每种类型的字节数的表:


以下是一些计算结构尺寸的示例:
struct s1{
char ch1;
char ch2;
int i;
};
此结构的大小易于计算,为8. ch1和ch2总共占用4个字节,我占用4个字节,总共8个字节.
struct s1{
char ch1;
int i;
char ch2;
};
以上和上面的只是结构成员顺序的变化,但是大小变为12. 这是因为offset是成员的整数倍,ch1的偏移为0,i的偏移不能为1,因为1并非i的倍数(大小4),所以i的偏移量为4,ch2的偏移量为8,加上ch2为9如何计算结构体大小,结构的大小为该成员的整数倍大小,即12.
struct s2{
char ch;
int i;
char str[10];
};

这个结构的大小是20如何计算结构体大小,首先看一下前两个成员,大小是8,毫无疑问,这个char类型的数组,您只需要把它看作十个char,加起来就是18 ,然后满足结构大小为成员的整数倍,因此大小为20.
使用数组成员A array [n],只需将此数组视为n个A型数据连接在一起即可.
struct s3{
char ch;
int i;
struct s{
char ch1;
int j;
}sub;
float f;
};
此结构的大小为8,那么结构的大小是否对齐8?此结构的大小为20,显然不是8的倍数. 因此,在计算结构的大小时,内部的结构被视为char和int,而不是整体.
最宽的基本类型成员是j(4位数字),然后
ch占4个字节,i占4,ch1占4,j占4,f占4,共20.

struct s3{
char ch;
char i;
struct s{
char ch1;
int j;
}sub;
char f;
};
请注意,结构(s3)中结构中的数据不能与先前的数据进行内存对齐.
上面s中的ch1和ch,i不能一起占用4个字节,必须另外开发4个字节的内存. 这需要注意. 因此大小为4 + 4 + 4 + 4 = 16,而不是4 + 4 + 4 = 12.
struct s3{
char ch;
char i;
struct s{
char ch1;
double j;
}sub;
char f;
};
最宽的基本类型成员是j(8位数字),然后
ch和i总共占用8个字节,ch1占用8个字节,j占用8个,f占用8个,总共32个.

struct s5{
char ch;
int i;
union{
char ch1;
int j;
};
};
联合的大小是成员中最大类型的大小,因此此结构的大小为12.
4(ch)+4(i)+4(j)= 12.
指定对齐方式值: #pragma pack(n)//将对齐方式指定为n
#pragma pack(n)如果以#pragma pack()结尾,则表示到目前为止,这种对齐方式.
#pragma pack(4) //指定向4对齐 最大是8
struct s6{
char ch;
int i;
float f;
double d;
};
如果不指定对齐值,则此结构的大小为8(ch,i)+8(f)+8(d)= 24,我们指定对齐为4,因此大小为整数倍4,所以结构的大小是4(ch)+4(i)+4(f)+4(d)+4(d)= 20.
#pragma pack(10) //指定向10对齐 最大是8
struct s7{
char ch;
int i;
float f;
double d;
};
我们指定的对齐值是10,最大值是8,是否对齐10?否,当指定的对齐值大于自对齐值时,对齐自对齐值,大小为24,即8(ch,i)+8(f)+8(d)= 24
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-262483-1.html
甲午海战前
给你点个赞