Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 具有对齐成员的对象的动态分配-可能的解决方案?_C++_Visual C++_Memory Management_Sse_Memory Alignment - Fatal编程技术网

C++ 具有对齐成员的对象的动态分配-可能的解决方案?

C++ 具有对齐成员的对象的动态分配-可能的解决方案?,c++,visual-c++,memory-management,sse,memory-alignment,C++,Visual C++,Memory Management,Sse,Memory Alignment,我正在考虑使用SSE来加速我项目中的一些代码。这通常需要对我正在处理的数据进行16字节的对齐。对于静态分配,我认为\uu declspec(align(16))解决了这个问题,但我的问题是:在进行动态分配时,确保这一点的最佳方法是什么?特别是在分配的对象不直接需要对齐,而是使用具有对齐要求的对象作为成员的情况下(这样就更容易忘记确保其正确对齐)。我提出了以下解决方案: 始终假定任何潜在的非静态分配数据未对齐,并使用未对齐的加载指令。据我所知,这很慢,在这种情况下,可能根本不值得为SSE操心。我可

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

  • 始终假定任何潜在的非静态分配数据未对齐,并使用未对齐的加载指令。据我所知,这很慢,在这种情况下,可能根本不值得为SSE操心。我可以实现它并测试它的性能,但在我投入大量工作之前,我宁愿询问更好的解决方案,只是为了发现它不值得,或者有另一种解决方案

  • 请非常小心,仅使用
    \u aligned\u malloc
    /
    \u aligned\u free
    分配任何需要对齐的对象以及任何使用这些对象作为成员的对象。这可能很容易忘记,因此容易出错

  • 重载
    新建
    /
    全局删除
    和/或创建自定义的
    malloc
    /
    释放
    函数以对齐内存,然后将其用于所有操作。然而,将动态分配的所有内容进行对齐可能不是最好的方法

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

  • 我没有想到或者没有意识到的其他方式

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


    提前感谢:)

    在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