首页 > 代码库 > 结构体声明与内存对齐

结构体声明与内存对齐

1、结构体的声明:

  1)struct Student{

    int stu_id;

    char name[25]

    int age;

    char sex;

    };

  Student student1, student2;

  2)struct Student{

    int stu_id;

    char name[25]

    int age;

    char sex;

    }student1,student2;

  3)struct {

    int stu_id;

    char name[25]

    int age;

    char sex;

    }student1,student2;

  声明一个结构体只是一种结构体类型,它相当于一个模型,但其中并无具体数据,系统也不为之分配实际的内存单元,为了能在程序中使用结构体类型的数据,应当定义结构体类型的变量,并在其中存放具体的数据,即结构体本身不会被作为数据而开辟内存,真正作为数据而在内存中存储的是这种结构体所定义的变量。

2.结构体内存对齐:

  不同编译器,内存会有所不同,在存储结构体时会按照内存对齐进行处理,本文只考虑win32下情况,下表是不同数据类型在内存中所占的大小。

 charshortintfloatlongdoublelong longlong double
长度12444888

 

  例1:没有挤占,int型所占空间最大,以int型对齐,即整体空间为4的位数。

  struct Student{

    int stu_id;              //占4位

    char name[25] ;      //字符数组为25位,对齐应该补3位

    int age;                //占4位

    char sex;             //占1位,对齐应该补3位

    };

  实际占内存大小为:40。

  例2:内部挤占,以int型空间对齐,即整体空间为4的位数。

  struct Student{

    int stu_id;              //占4位

    char name[25] ;      //字符数组为25位,取4的倍数,因此为占28位

    char sex;             //向上挤占,因此占0位

    int age;               //占4位

    };

  实际占内存大小为:36。

  例3:内部挤占,以double型空间对齐,即整体空间为8的位数。

  struct Student{

    int stu_id;              //int为4位,补4位

    char name[25] ;      //字符数组为25位,补7位,占32位

    char sex;             //char为1位,向上挤占,因此占0位

    double age;          //占8位

    };

   实际占内存大小为:48。

 

结构体声明与内存对齐