结构体内存对齐的原则及原理

Posted lzd626

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了结构体内存对齐的原则及原理相关的知识,希望对你有一定的参考价值。

结构体是C语言的一大特色,今天就来思考两个问题。

  1. 它的成员的顺序排列有什么要求吗?

原则一:结构的首变量地址偏移量offset0,之后每个变量的首地址都要是其本身宽度的整数倍。总size=(0+1)+(3+4)+(0+8)=16

 技术分享图片

 

原则二:结构体的大小一定是最大成员宽度的整数倍,依照原则1,总size=8+4+1=13;因为原则二,所以要在char后补齐3位,总size=16

 技术分享图片

 

  2.为什么要设计内存对齐这种方式?

cpu需要取4个连续的字节时,若内存起始位置的地址可以被4整除,那么我们称其对齐访问,首先很多CPU并不支持非对齐的内存访问,比如我们使用的stm32(有些x86结构的复杂指令集CPU,可以非对齐内存访问,他采取多次读取对齐的内存,然后拼接数据来实现;但这样会增加数据访问的时间,和电路设计的复杂性);硬件电路为何会更复杂这个问题,先不深入讨论。所以内存对齐明白会提高CPU的访问速度就 OK了。

以上是关于结构体内存对齐的原则及原理的主要内容,如果未能解决你的问题,请参考以下文章

结构体内存对齐

结构体内存对齐

Visual Studio2008 C++结构体成员需要内存对齐吗?

结构体大小的计算以及内存对其原则和修改默认对齐数

结构体进阶知识 struct内存对齐(笔试面试常考)

结构体字节对齐问题探究