内存和CPU之间的交互, CPU通过地址总线去内存选址 如果地址总线 8 位则能找到 256 个地址所以,只能用到256的内存。 32位 地址总线就可以寻址 4G内存。每次操作一字节太慢,如果每次操作4字节,则需要32位数据总线,如果每次操作8字节则需要64位地址总线。
内存的设计是上图, 每次寻址是从不同的chip中选出相同位置的一个字节,来组成一个连续的8个字节。通过这样的并行操作,提高了内存访问效率,但是这样的设计,address的选址必须是8的倍数。
有些CPU可以支持访问任意地址,是因为做了一些处理,但是这样会降低效率。为保证程序的高效运行,编译器会把数据放在合适的位置并占用合适的长度,这就是内存对齐。每种类型的对齐值,就是它的对齐边界。要求占用的地址,及字节数都是它边界的倍数。
如何确认内存边界
32位系统上指针大小和寄存器大小都是4字节,64位系统上指针大小和寄存器大小都是8字节。
数据类型的对齐边界取 数据类型大小和平台最大对齐边界中较小的那个。减少类型,降低性能
为什么不统一用平台最大边界: 会造成地址浪费
为什么不能用大于平台边界:也会造成地址浪费
结构体内存对齐
取结构题中所有成员的对齐值也就是大小, 再取出最大的,就是结构体的边界值。结构体的内存应该是这个边界值的倍数。 所以结构体大小是24字节。
如果不扩容到边界值的整数倍,数组内的结构体内存不对齐了。只有每个结构体的内存都是边界值的整数倍,才会内存对齐。