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

本文详细解析了C语言中结构体的内存对齐原则,通过实例代码展示了如何计算结构体的大小,并探讨了对齐原则对于提高CPU运算速度、解决平台移植问题及提升性能的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

 

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

例如:

 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类型;

12345678

first

 

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

12345678

second

 

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

12345678

second

 

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

 2345678

second

 

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

 

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

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

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

转载于:https://www.cnblogs.com/xgmzhna/p/10726805.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值