主要是记录一下,在学习过程中认为容易忘记且重要的东西,方便以后忘了再来学习一下。 集中于结构体部分以及结构体对齐的知识。
结构体的使用练习
1、定义一个结构体Gamer用来存储一个游戏中的角色的信息,包括血值、等级、坐标等信息 。
要求:
(1) 具体包含哪些信息自由设计
(2) 但这些包含的类型中,必须要有一个成员是结构体类型。
2、定义一个函数,用来给这个结构体变量赋值.
3、定义一个函数,用来显示这个结构体变量的所有成员信息.
#include #include #include struct point{ int x; int y; int z;};struct Gamer{ char name[20]; int level; float HP; point a;}No1;void Function(){ char a[]="xiaozhi"; for (int i = 0; i
sizeof的使用
基本类型的sizeof
可以使用类型,也可以使用变量
例子:
printf("%d",sizeof(char)); printf("%d",sizeof(int)); printf("%d",sizeof(float));printf("%d",sizeof(double));int x = 10;//变量printf("%d",sizeof(x));```### 数组类型的sizeof例子:
char arr1[10] = {0};
short arr2[10] = {0};
int arr3[10] = {0};
printf(“%d”,sizeof(arr1)); //10
printf(“%d”,sizeof(arr2)); // 20
printf(“%d”,sizeof(arr3)); // 40
printf(“%d”,sizeof(arr1[10])); // 1
printf(“%d”,sizeof(arr2[10])); // 2
printf(“%d”,sizeof(arr3[10])); //4
注意其中的不同。## 结构体(内存)对齐### 为什么要有内存对齐?本质:是要效率还是空间,二选一的结果.统称是性能,还有台移植等因素,编译器对数据结构进行了内存对齐。### pragma pack的基本用法在vc6.0++中默认值是8字节对齐。
#pragma pack( n )结构体。#pragma pack( )
该操作会改变一个结构体的字节对齐数,这是针对编译器的。对齐参数:n为字节对齐数,其取值为1、2、4、8,默认是8。如果这个值比结构体成员的sizeof值小,那么该成员的偏移量应该以此值为准,**即是说,结构体成员的偏移量应该取二者的最小值.**
#pragma pack(n)
struct Test
{
int a ;
__int64 b ;
char c ;
};
#pragma pack()
以下是各种情况的内存对齐分析:1:1字节对齐![-w155](/images/15735626712023.jpg)2:2字节对齐时:![-w266](/images/15735626990588.jpg)3:4个字节对齐![-w381](/images/15735627321430.jpg)4、8个字节对齐![-w583](/images/15735627463362.jpg)### 对齐原则:原则一:数据成员对齐规则:结构的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小的整数倍开始(比如int在32位机为4字节,则要从4的整数倍地址开始存储).原则二:结构体的总大小,也就是sizeof的结果,必须是其内部最大成员的整数倍,不足的要补齐。原则三:如果一个结构里有某些结构体成员,则结构体成员要从其内部最大元素大小的整数倍地址开始存储。**(struct a里存有struct b,b里有char,int,double等元素,那b应该从8的整数倍开始存储.)**原则四:对齐参数如果比结构体成员的sizeof值小,该成员的偏移量应该以此值为准.也就是说,结构体成员的偏移量应该取二者的最小值.**由浅入深,分析内存对齐原则后内存到底是怎么分配的**#### 案例分析一:
struct Test
{
char a;
int b ;
};
![-w671](/images/15735632219948.jpg)**sizeof(Test) =1+3(补齐的)+4=8(其中最大的4的整倍数)**#### 案例二分析:
struct Test
{
int a ;
__int64 b ;
char c ;
};
![-w621](/images/15735634186981.jpg)**sizeof(Test) =4+4(补齐的)+8+1+7(补齐的)=24(其中最大的8的整倍数)**#### 案例三分析:
struct Test
{
int a ;
__int64 b ;
char c ;
char d ;
};
![-w662](/images/15735635119907.jpg)**sizeof(Test) =4+4(补齐的)+8+1+1+6(补齐的)=24(其中最大的8的整倍数)**#### 案例四分析:
struct S1
{
char c;
double i;
};
![-w530](/images/15735636051365.jpg)**sizeof(S1) =1+7(补齐的)+8=16(其中最大的8的整倍数)**#### 案例五分析:
struct S2
{
int c1;
char c2[10];
};
![-w547](/images/15735636961393.jpg)**sizeof(S2) =4+10+2(补齐的)=16(其中最大的8的整倍数)**#### 案例六分析:
struct S3
{
char c1;
S1 s;
char c2;
char c3;
};
![-w539](/images/15735637638057.jpg)**sizeof(S3) =1+7+1(s中的char c)+7(补齐的)+8(s中的double)+1+1+6(补齐的)=32(其中最大的8的整倍数)**#### 案例七分析:
struct S4
{
char c1;
S1 s;
char c2;
double c3;
};、
{% image /images/15735639114324.jpg '-w558' '' %}**sizeof(S4) =1+7+1(s中的char c)+7(补齐的)+8(s中的double)+1+7(补齐的)+8=40(其中最大的8