C++ 具有对齐成员的对象的动态分配-可能的解决方案?
我正在考虑使用SSE来加速我项目中的一些代码。这通常需要对我正在处理的数据进行16字节的对齐。对于静态分配,我认为C++ 具有对齐成员的对象的动态分配-可能的解决方案?,c++,visual-c++,memory-management,sse,memory-alignment,C++,Visual C++,Memory Management,Sse,Memory Alignment,我正在考虑使用SSE来加速我项目中的一些代码。这通常需要对我正在处理的数据进行16字节的对齐。对于静态分配,我认为\uu declspec(align(16))解决了这个问题,但我的问题是:在进行动态分配时,确保这一点的最佳方法是什么?特别是在分配的对象不直接需要对齐,而是使用具有对齐要求的对象作为成员的情况下(这样就更容易忘记确保其正确对齐)。我提出了以下解决方案: 始终假定任何潜在的非静态分配数据未对齐,并使用未对齐的加载指令。据我所知,这很慢,在这种情况下,可能根本不值得为SSE操心。我可
\uu declspec(align(16))
解决了这个问题,但我的问题是:在进行动态分配时,确保这一点的最佳方法是什么?特别是在分配的对象不直接需要对齐,而是使用具有对齐要求的对象作为成员的情况下(这样就更容易忘记确保其正确对齐)。我提出了以下解决方案:
\u aligned\u malloc
/\u aligned\u free
分配任何需要对齐的对象以及任何使用这些对象作为成员的对象。这可能很容易忘记,因此容易出错新建
/全局删除
和/或创建自定义的malloc
/释放
函数以对齐内存,然后将其用于所有操作。然而,将动态分配的所有内容进行对齐可能不是最好的方法new
/delete
运算符创建一个基类,然后确保任何需要对齐的类和任何使用这些运算符作为成员的类都继承它。然后对大多数/所有动态分配使用new
/delete
。可能比2更不容易出错提前感谢:)在Windows上,malloc是16字节对齐的()。如果您的平台malloc具有较低的对齐要求,则需要为SSE使用的对象使用对齐版本的malloc
编辑:如果您有需要SSE支持的特定对象类,您可以仅为该类重新定义new/delete。不确定这是否适用于您的目的,但您可以使用和定义MALLOC_对齐宏以满足您的需要(最多128字节)
您甚至不需要更换默认分配器-您应该能够使用Doug Lea specific
dlmalloc
和dlfree
仅用于您的SSE需求,并继续使用默认分配器进行其他所有操作。为什么不将需要它的成员对齐?如果我正确理解你(以及如何\uu declspec(align)
或类似的工作),那么这不会有太大的改变。如果我有一个需要对齐的类Foo
,我会在其定义中使用\uuu declspec(align(16))
,它将为所有静态分配正确对齐,而不需要在用作类Bar
的成员时显式对齐。不过,这并不会改变动态分配的任何内容,我必须使用我提到的Foo
和Bar
解决方案之一,以及任何其他使用这两者作为成员的类。感谢链接。我不知道,遗憾的是,显然这只适用于64位平台,当编译为32位malloc
对齐为8字节时,将其默认行为更改为16可能会对32位平台的性能产生负面影响。是的,我担心“最干净”和最安全的解决方案是对所有直接或通过其成员之一使用SSE并使用new(对我而言)的类重载new
/delete
在为64位平台编译时,链接中的信息只是禁用该代码。@CuriousCppUser,不要忘记为对齐对象的任何标准容器提供自定义分配器,因为默认分配器只调用全局运算符new
。