关键字struct
结构体(struct)是由不同类型数据组成的数据结构。它的本质是一种数据结构。
struct haha
{
char a;
int b;
int *c;
·····
}mystruct;
- 结构体定义的时候如以上格式,“haha”是我们定义的结构体的“体名”,而“mystruct”是结构体类型的变量名。希望同学们注意:在引用结构体变量时,勿把结构体的名字当成变量名使用。
mystruct.a; //访问成员变量a
haha.a; //错误写法
- 当我们定义结构体不写结构体的“体名”的时候,我们称其为无名结构体。定义一个无名结构的时候,应将变量一同写出,否则在后面的代码编写中你会发现,无法通过这个结构体再次定义变量。因为它没有名字啊,系统不知道去哪找对应的结构体。
struct //无名结构体
{
char a;
int b;
int *c;
·····
}mystruct1, mystruct2;
- 调皮的同学会如下定义,这个时候要注意:当结构体成员变量中包含结构体类型的指针时,这个指针只能指向这个结构体的本身,不能指向其他的结构体!
struct haha
{
struct *a;
·····
}mystruct;
接下来涉及关于结构体比较重要的一个概念——字对齐
字对齐是一种为了方便CPU读取数据而存在的特殊规则。以空间换取时间。为了在可接受的空间浪费的前提下,尽可能提高对相同过程的最快处理。
系统默认的对齐规则至少有两点:
1.变量的最高效加工。
2.在达到条件 1 的前提下使用最少的空间。
字对齐的原则
1.数据类型自身的对齐值:即“sizeof(基本数据类型)”。
2.指定对齐值:系统默认的对齐值(32系统为4字节)
3.结构体本身的对齐值:成员中自身对齐值最大的那个值
4.有效对齐值:有效对齐值N是表示对齐在N地址上,若 “ 当前内存地址N % 数据类型自身的对齐值==0 ”则在内存上排放该成员,否则补空格,直到当前内存地址能够整除此时需要排放的数据成员。注意:计算占用内存大小时别忘记把空格算上。
5.在最后一个成员排放好后,还要根据结构体本身的对齐值来补齐空格对齐!!
6.如果在一个结构体中还嵌套有结构体,则嵌套的结构体按照自己本身的对齐规则计算好大小,再当做一个成员来进行排放
实例:
struct A
{
char c; // 占 1字节
int d; //空 3字节,占 4字节
short e; //占 2字节,补 2字节
};sizeof(A)== 12
struct B
{
char c; //占 1字节
_int64 d; // 空 7字节,占 8字节
int e; //占 4字节
short f; //占 2字节
A g; // 空 2字节,占 12字节
char h; //占 1字节
int i; //空 3字节,占 4字节。末尾空 4字节
};sizeof(B)== 48
如果你能弄明白上面这个实例,字对齐原则相信你已经掌握了。