使用对齐成员动态分配对象 - 可能的解决方案?

时间:2012-02-09 00:27:06

标签: c++ visual-c++ memory-management sse memory-alignment

我正在考虑使用SSE来加速我项目中的一些代码。这通常需要我正在处理的数据的16字节对齐。对于静态分配,我认为__declspec(align(16))解决了问题,但我的问题是:在进行动态分配时,确保这种情况的最佳方法是什么?特别是在分配的对象不直接需要对齐但使用具有对齐要求的对象作为成员的情况下(因此更容易忘记确保它正确对齐)。我提出了以下解决方案:

  1. 始终假设任何可能非静态分配的数据未对齐并使用未对齐的加载指令。从我读到的内容来看,这很慢,在这种情况下根本不值得使用SSE。我可以实现它并测试它的执行情况,但在我付出这么多工作之前我宁愿问一下更好的解决方案,只是为了发现它不值得,或者有其他解决方案。

  2. 要非常小心并仅使用_aligned_malloc / _aligned_free来分配任何需要对齐的对象以及使用这些对象作为成员的任何对象。这可能很容易忘记,因而容易出错。

  3. 全局覆盖new / delete和/或创建对齐内存的自定义malloc / free函数,然后将其用于所有内容。但是,对于动态分配的所有来说,这可能不是最好的主意。

  4. 创建一个带有重载new / delete运算符的基类,然后确保任何需要对齐的类和任何使用这些成员的类都继承它。然后只需使用new / delete进行大多数/所有动态分配。可能不那么容易出错2。

  5. 我没有想到的其他方式或者我不知道的其他方式?

  6. 选项1.-3。可能不是最好的想法。 4怎么样?我提到的任何事都错了吗?关于这个主题的建议,意见,有用的链接?

    提前谢谢你:)

2 个答案:

答案 0 :(得分:3)

在Windows上,malloc是16字节对齐的(msdn)。如果您的平台malloc具有较低的对齐要求,则需要对SSE使用的对象使用malloc的对齐版本。

编辑:如果您有特定类别的对象需要SSE支持,则只能重新定义该类的新/删除。

答案 1 :(得分:0)

不确定这是否适用于您的目的,但您可以使用Doug Lea's allocator并定义MALLOC_ALIGNMENT宏以满足您的需求(最多128字节)。

您甚至不需要替换默认分配器 - 您应该只能使用Doug Lea特定的dlmallocdlfree来满足您的SSE需求,并继续使用默认分配器来处理所有内容其他