1.问题导入
#include"windows.h" #include"stdio.h" #pragma pack(8) struct MyStruct { char a; int b; char c; }; struct MyStruct2 { int a; char b; char c; }; int main() { printf("%d\n", sizeof(MyStruct)); printf("%d\n", sizeof(MyStruct2)); }
两个含有相同的变量只是变量类型顺序不同的结构体的大小分别是多少呢?
在默认对齐方式为8字节的情况下
S1:12 B
a 0 0 0
b b b b
c 0 0 0
S2:8 B
a a a a b c 00
2.本质:以空间换时间,提高效率
2.1对齐参数:默认是8
在哪里查看和更改呢?
使用代码更改默认对齐参数
#pragma pack(n) n为指定的对齐参数,其值可以为 1,2,4,8,16
3.对齐规则
(1)数据成员对齐规则:结构体的数据成员,第一个数据成员要放在offset为0的位置,以后的每个数据成员存储的起始位置(与对齐参数比较选小的)要从较小值的整数倍开始
(2)结构体的总大小,必须是其内部最大成员(或是对齐参数两者较小值)的整数倍,不足补齐
(3)如果一个结构里有某些结构体成员,则结构体成员必须从其内部最大元素大小的整数倍地址开始存储
4.如何写结构体最节省空间呢?
按照数据类型从小到大的顺序进行书写
5.练习(在默认对齐是8B的前提下)
struct Struct1 { char c; double i; }; c 0 0 0 0 0 0 0 i i i i i i i i 长度为:16B
struct Struct2 { char c1; Struct1 s; char c2; char c3; }; c1 0 0 0 0 0 0 0 c 0 0 0 0 0 0 0 i i i i i i i i c2 c3 0 0 0 0 0 0 长度为:32B
struct S4 { int c; char b[10]; }; cccc bbbb bbbb bb00 长度为:16B
struct Struct2 { char a; S4 s; char d; }; a000 cccc bbbb bbbb bb00 d000 长度为:24B