欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

4-17疑难点 c语言之【结构体对齐】

程序员文章站 2022-09-10 13:55:54
今天学习了结构体这一章节,了解到了结构体在分配内存的时候采取的是对齐的方式 例如: 在这段程序中 输出的并不是 15 //结构体集合内元素大小的简单相加 而是 16 //此处就体现了在c语言结构体中内存开辟的原则 对齐原则 结构体对齐: 以最大的基本元素的大小(除数组)对齐,以本段程序为例: 1. ......

 

 

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

例如:

 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 寝室随笔