天天看点

结构体内存对齐、修改默认对齐数

计算结构体的大小。 这也是一个特别热门的考点: 结构体内存对齐

如何计算?

首先要掌握结构体的对齐规则:

第一个成员在结构体变量偏移处为0的地址处。 其他成员要对齐到某个数字(对齐数)的整数倍的地址处 对齐数=编译器默认的一个对齐数与该成员大小的较小值。vs中默认为8。Linux中默认值为4。 结构体总大小为最大对齐数的整数倍。 如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体整体就是所有最大对齐数的整数倍。

让我们做几个练习练习一下:

为什么存在内存对齐?

平台原因(移植原因):不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址 处取某些特定类型的数据,否则抛出硬件异常。

性能原因: 数据结构(尤其是栈)应该尽可能地在自然边界上对齐。 原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;而对齐的内存访问仅需要一次访问。

总体来说:

结构体的内存对齐是拿空间来换取时间的做法。

那在设计结构体的时候,我们既要满足对齐,又要节省空间,如何做到:

让占用空间小的尽量集中在一起

举个栗子:

S1和S2类型成员一模一样,但是S1和S2所占用的空间的大小有一些区别。

之前我们见过了 #pragma 这个预处理指令,这里我们再次使用,可以改变我们的默认对齐数

结构体内存对齐、修改默认对齐数