黑马程序员——C语言—结构体变量存储原理

来源:互联网 发布:全排列的递归实现算法 编辑:程序博客网 时间:2024/06/03 23:08

------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------
1、结构体存储原理

    结构名只能表示一个结构形式,编译系统并不对它分配内存空间。只有当某变量被说明为这种类型的结构时,才对该变量分配存储空间。

    内存是以字节为单位编号,但一些硬件平台对某些特定类型的数据之恩能够从某些特定地址开始,比如从偶地址开始。若不按照适合其平台的要求对数据存放进行对齐,会影响到效率。因此,在内存中,各类型的数据是按照一定的规则在内存中存放的,这就是对齐问题。

结构体占用的内存空间是每个成员占用的字节数之和(考虑对齐问题)。

2、结构体数据成员对齐的意义

    许多实际的计算机系统对基本类型数据在内存中存放的位置限制,它们会要求这些数据的起始地址的值是某个数K的倍数,这就是所谓的内存对齐,而这个K则被称为该数据类型的对齐模数(alignment modules)。

    这种强制的要求一来简化了处理器与内存之间传输系统的设计,二来可以提升读取数据的速度。比如这么一种处理器,它每次读写内存的时候都从某8倍数的地址开始,一次读出或写入8个字节的数据,假如软件能保证double类型的数据都从8倍数地址开始,那么读或写一个double类型数据就只需要一次内存操作。否则,我们可能需要两次内存操作才能完成这个动作,因为数据或许恰好横跨在两个符合对齐要求的8字节内存块上。

3、结构体对齐的含义

1)结构体总长度

2)结构体内各数据成员的内存对齐,即数据成员相对结构体的起始位置

4、结构体变量占用存储空间大小的计算方法和步骤

1)将结构体内所有数据成员的长度相加,记为sum_a;

2)将各数据成员为了内存对齐,按各自对齐模数而填充的字节数累加到和sum_a上,记为sum_b。对齐模数是#pragma pack指定的数值以及该数据成员自身长度中数值较小者。该数据相对起始位置应该是对齐模数的整数倍;

3)将和sum_b向结构体模数对齐,该模数是#pragma pack指定的数值和结构体内部最大的基本数据类型成员长度中数值较小者。结构体的长度应该是该模数的整数倍。


所谓“对齐在N上”,指定是“存放起始地址%N=0”


#include <stdio.h>int main(int argc, const char * argv[]) {        //计算结构体变量在内存中占用的字节数的方法    //1)先找对齐模数    //  对齐模数 是结构体中的基本数据类型中占用字节数最大的那个    //          4    //2)在计算结构体变量的中各个成员占用的字节和        struct A{            char ch[13];        char ch1[11];        int a;       };    //定义结构体变量    struct A a1;    printf("%ld\n",sizeof(a1));<span style="font-family: Arial, Helvetica, sans-serif;"> </span>    return 0;}
结果为:28


0 0
原创粉丝点击