今天学习了结构体这一章节,了解到了结构体在分配内存的时候采取的是对齐的方式

例如:

 1 #include<stdio.h>
 2 struct test1
 3 {
 4     int a;
 5     char b;
 6     short c;
 7     double d;
 8 };
 9 int main()
10 {
11   printf("%d\n",sizeof(struct test1));
12 
13   return 0;  
14 }

  在这段程序中

  输出的并不是       15          //结构体集合内元素大小的简单相加

  而是        16      //此处就体现了在c语言结构体中内存开辟的原则  对齐原则

  结构体对齐: 以最大的基本元素的大小(除数组)对齐,以本段程序为例:

  1. 系统找到结构体内最大元素的大小(double的大小),并以此先开辟一个空间,此空间内存下double类型;

1 2 3 4 5 6 7 8

first

 

  2.再开辟一个最大元素的大小空间,依次找第二大的元素,并存入double大小的空间内,5678内存下int类型;

1 2 3 4 5 6 7 8

second

 

  3.余下的四个空间内能存入short,12内存下short类型;

1 2 3 4 5 6 7 8

second

 

  4.余下的两个空间内能存入char,4内存下char类型

  2 3 4 5 6 7 8

second

 

至此结构体内元素全部存完,一共开辟了两次也就是 16个字节的大小                                                 注:此处为什么int要存在5678,以及char存在4,这两个类型都不按顺序存储,有待研究。

 

为什么当初c语言开发时结构体采取一个这样的方式进行存储?在查询一些资料后,我总结有以下原因:

  1. 提高cpu运算速度,一次性能读完一个元素。
  2. 平台原因,也就是移植原因,不是所有的硬件平台都能访问任意地址的任意数据,某些硬件平台只能在某些地址处取某些特定类型的数据的,否则就会硬件异常。
  3. 性能原因,数据结构(尤其是栈),应该尽可能在自然边界上对齐,因为在访问为对齐的内存时,处理器需要访问两次,而对齐的内存处理器只需要访问一次。

2019-04-17 22:45:14 寝室随笔

posted on 2019-04-17 22:46  coding小菜鸟  阅读(252)  评论(0编辑  收藏  举报