为什么Malloc()关心边界对齐?

use*_*028 24 c c++ pointers memory-management

我听说malloc()根据正在分配的类型来调整内存.例如,从" 理解和使用C指针 "一书中:

分配的内存将根据指针的数据类型进行对齐.例如,一个四字节整数将分配在一个可被4整除的地址边界上.

如果我遵循,这意味着 int *integer=malloc(sizeof(int));将分配在一个可被4整除的地址边界上.即使没有(int *)在malloc上施放.

我在聊天服务器上工作; 我读到了与s 类似的效果struct.

我不得不问:从逻辑上讲,为什么地址边界本身可以被整除呢?将一组内存分配到n*sizeof(int)地址上使用整数的调整有129什么问题?

我知道指针算法是如何工作的*(integer+1),但我无法弄清楚边界的重要性......

cni*_*tar 27

分配的内存将根据指针的数据类型进行对齐.

如果你在谈论malloc,这是错误的.malloc不关心你对数据做什么,并将分配内存对齐以适应最严格的本机类型的实现.

从标准:

如果分配成功,则返回指针,以便可以将其分配给指向具有基本对齐要求的任何类型对象的指针,然后用于在分配的空间中访问此类对象或此类对象的数组(直到空间被明确释放)

和:

从逻辑上讲,为什么地址边界本身可以被整除

由于底层机器的工作原理,访问未对齐的数据可能更昂贵(例如x86)或非法(例如arm).这使得硬件可以采用快捷方式来提高性能/简化实施.


Mat*_*son 10

在许多处理器中,未对齐的数据将导致"陷阱"或"异常"(这是与C++编译器理解的异常不同的异常形式.甚至在数据未对齐时不捕获的处理器上也是如此当数据未正确对齐时,它通常较慢(例如,慢两倍).因此,在编译器/运行时库中确保事物很好地对齐是最好的.

顺便说一句,malloc(通常)不知道你在分配什么.Insteat malloc将把所有数据(无论大小是多少)对齐到一般对于通用数据访问"足够好"的合适边界 - 在现代OS /处理器组合中通常为8或16字节,在旧系统中为4字节.

这是因为,malloc如果你不知道char* p = malloc(1000);或者double* p = malloc(1000);,因此它必须假设你是存储double或任何与最大对齐要求的项目.


oog*_*oga 4

对齐的重要性不是语言问题而是硬件问题。有些机器无法读取未正确对齐的数据值。其他人可以做到这一点,但效率较低,例如,需要两次读取才能读取一个未对齐的值。