c – 在设计内存池时如何考虑对齐?
我正在为一个小型游戏引擎开发内存池.
主要用途是作为隔离存储;池包含特定类型和大小的对象.目前,池可用于存储任何内容,但分配将在特定大小的块中完成.大多数内存需求将立即分配,但如果需要协助调整(几乎固定大小),可以启用“过度增长”. 问题是,在考虑内存对齐时,我开始有些偏执.我只习惯8位处理器上的原始内存管理,其中所有内容都是字节对齐的. 我让用户(我)指定所需的块大小,在隔离存储的情况下,它将是我将要存储在其中的对象的大小. 当前的方法是分配一大块内存块*(desired_size header_size)大并将对象放入其中,每个块都有一个头;对象显然会直接位于此标题后面. 在我的场景中,关于内存对齐,我需要考虑什么? 到目前为止我得出的答案是,只要desired_size代表n字节对齐的数据;标题由编译器正确对齐和打包以及实际数据,存储在块中的所有内容都将是n字节对齐的. n是平台所需的任何边界.我目前的目标是x86,但我不想在我的代码中对平台做任何假设. 我使用过的一些资源: > http://www.ibm.com/developerworks/library/pa-dalign/ 编辑 上传的小样本代码可能会对将来here中与我混淆的任何人有所帮助. 解决方法
保证malloc的分配对于编译器提供的任何类型都是对齐的,因此任何对象[*]都是如此.
当您的标题的对齐要求小于实现的最大对齐要求时,存在危险.那么它的大小可能不是最大值的倍数.对齐,所以当你尝试转换/使用buf header_size作为指向具有最大值的东西的指针.对齐,它是错位的.就C而言,这是未定义的行为.在英特尔它的工作,但速度较慢.在某些ARM上,它会导致硬件异常.在某些ARM上,它默默地给出了错误的答案.因此,如果您不想在代码中对平台做出假设,则必须处理它. 基本上我有三个技巧可以确保你的标题不会导致错位: >使用特定于实现的对齐编译指示来强制解决问题. 或者,您可以将header_size定义为不是sizeof(标题),但是将该大小四舍五入为2的“2足够好”的倍数.如果你浪费了一点内存,那就这样吧,你可以随时拥有一个“可移植性标题”来定义这种事物,这种方式不是纯粹与平台无关的,而是可以很容易地适应新平台. [*]有一个常见的例外是超大的SIMD类型.由于它们是非标准的,并且仅仅因为它们而对每个分配进行16对齐将是浪费的,所以它们被手动放在一边,并且你需要特殊的分配功能. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |