c – 在设计内存池时如何考虑对齐?

前端之家收集整理的这篇文章主要介绍了c – 在设计内存池时如何考虑对齐?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在为一个小型游戏引擎开发内存池.

主要用途是作为隔离存储;池包含特定类型和大小的对象.目前,池可用于存储任何内容,但分配将在特定大小的块中完成.大多数内存需求将立即分配,但如果需要协助调整(几乎固定大小),可以启用“过度增长”.

问题是,在考虑内存对齐时,我开始有些偏执.我只习惯8位处理器上的原始内存管理,其中所有内容都是字节对齐的.

我让用户(我)指定所需的块大小,在隔离存储的情况下,它将是我将要存储在其中的对象的大小.

当前的方法是分配一大块内存块*(desired_size header_size)大并将对象放入其中,每个块都有一个头;对象显然会直接位于此标题后面.

在我的场景中,关于内存对齐,我需要考虑什么?

到目前为止我得出的答案是,只要desired_size代表n字节对齐的数据;标题由编译器正确对齐和打包以及实际数据,存储在块中的所有内容都将是n字节对齐的.

n是平台所需的任何边界.我目前的目标是x86,但我不想在我的代码中对平台做任何假设.

我使用过的一些资源:

> http://www.ibm.com/developerworks/library/pa-dalign/
> http://en.wikipedia.org/wiki/Data_structure_alignment
> Memory alignment on a 32-bit Intel processor
> Boost Pool docs以获得一般设计的灵感.我想避免将推动拖入这个项目;而且我也将此视为学习机会.

编辑

上传的小样本代码可能会对将来here中与我混淆的任何人有所帮助.

解决方法

保证malloc的分配对于编译器提供的任何类型都是对齐的,因此任何对象[*]都是如此.

当您的标题的对齐要求小于实现的最大对齐要求时,存在危险.那么它的大小可能不是最大值的倍数.对齐,所以当你尝试转换/使用buf header_size作为指向具有最大值的东西的指针.对齐,它是错位的.就C而言,这是未定义的行为.在英特尔它的工作,但速度较慢.在某些ARM上,它会导致硬件异常.在某些ARM上,它默默地给出了错误的答案.因此,如果您不想在代码中对平台做出假设,则必须处理它.

基本上我有三个技巧可以确保你的标题不会导致错位:

>使用特定于实现的对齐编译指示来强制解决问题.
>使用特定于平台的结构布局和对齐知识,以确保其大小恰好是系统上最大对齐要求的倍数.通常这意味着,“如果需要将一个额外的int作为填充,以使其成为8倍,而不仅仅是4倍”.
>使标题成为每种标准类型的并集,以及您实际要使用的结构.在C中运行良好,但如果您的标题对于工会会员资格无效,则您在C中遇到问题.

或者,您可以将header_size定义为不是sizeof(标题),但是将该大小四舍五入为2的“2足够好”的倍数.如果你浪费了一点内存,那就这样吧,你可以随时拥有一个“可移植性标题”来定义这种事物,这种方式不是纯粹与平台无关的,而是可以很容易地适应新平台.

[*]有一个常见的例外是超大的SIMD类型.由于它们是非标准的,并且仅仅因为它们而对每个分配进行16对齐将是浪费的,所以它们被手动放在一边,并且你需要特殊的分配功能.

原文链接:https://www.f2er.com/c/110620.html

猜你在找的C&C++相关文章