【发布时间】:2014-06-27 20:03:22
【问题描述】:
我听说malloc() 根据分配的类型对齐内存。例如,来自Understanding and Using C Pointers一书:
分配的内存将根据指针的数据类型对齐。例如,一个四字节整数将分配在可被四整除的地址边界上。
如果我跟随,这意味着
int *integer=malloc(sizeof(int)); 将分配在可被四整除的地址边界上。即使没有在 malloc 上投射 (int *)。
我在一个聊天服务器上工作;我读到了similar effect 和structs。
我不得不问:从逻辑上讲,为什么地址边界本身在什么上可分很重要?使用地址 129 上的整数分配一组内存到 n*sizeof(int) 有什么问题?
我知道指针算术是如何工作的*(integer+1),但我不知道边界的重要性......
【问题讨论】:
-
我可以确认,这本书确实误导性地说,逐字:动态内存是从堆中分配的。 [...] 但是,分配的内存将根据指针的数据类型对齐。
-
见这里:gamedev.net/page/resources/_/technical/general-programming/… 这有点说明为什么对齐很重要以及分配器的选择。游戏大部分时间都在最大限度地利用计算机的性能,因此,我认为稍微看一下那篇文章是个好主意。看看
Aligned Allocations部分。在接近尾声时,它还显示了基准。 -
如果您尝试取消引用指向 32 位 int 的未对齐指针(sparc,我在看您...),也存在 CPU 会发出硬件陷阱。
-
在不知道标准内容的情况下,您可以立即判断该声明有问题。想想对 malloc() 的调用是什么样子的:malloc() 没有办法 知道指针的类型。
-
嘿,是的,你是对的。关于 c++ 的运算符“new”的陈述可能是真的,但不是 malloc。 malloc 必须假设最坏的情况。
标签: c++ c pointers memory-management