代码之家  ›  专栏  ›  技术社区  ›  KeyC0de

如何在“C++17”中调用重载的对齐new和delete运算符?

  •  0
  • KeyC0de  · 技术社区  · 6 年前

    cppreference 我们可以看到一些新的 new delete 以及 new[] delete[]

    2 回复  |  直到 6 年前
        1
  •  5
  •   Antony Peacock    6 年前

    您需要在您的类型上指定align as关键字,然后按常规调用new和delete。我在这里整理了一篇文章,并举例说明: https://github.com/Twon/Alignment/blob/master/docs/alignment_in_C%2B%2B.md

    #include <memory>
    
    int main() {
        class alignas(16) float4 {
            float f[4];
        }; 
    
        std::unique_ptr<float4 > aligned_vec4(std::make_unique<float4 >());
    }
    

    以及英特尔编译器的一个示例,该编译器当前通过新扩展头提供此功能: https://software.intel.com/en-us/articles/aligned-operator-new-support-in-intel-c-compiler

        2
  •  2
  •   zkoza    4 年前

    new 然而,迄今为止所有的答案都建议如何隐式地进行。

    auto q = new (std::align_val_t(256)) float;
    auto p = new (std::align_val_t(256)) float[10];
    

    解释

    我们去 https://en.cppreference.com/w/cpp/language/new (“new expression”)并导航到“Placement new”部分:

    如果提供了参数,它们将作为附加参数传递给分配函数

    嗯,差不多了。在这里: https://en.cppreference.com/w/cpp/memory/new/operator_new 我们读到:

    新表达式调用这些分配函数来分配内存,然后在内存中初始化新对象。也可以使用常规函数调用语法调用它们。

    我对打电话的可能性很感兴趣 operator new

    auto r = operator new (sizeof(float), std::align_val_t(256));
    auto s = operator new[] (sizeof(float)*10, std::align_val_t(256)); // don't do it!!!
    

    丑陋和危险,尤其是在类似数组的版本中,因为它没有与请求元素的数量相对应的参数的位置——它所需要的只是要分配的字节数,这可能需要考虑一些对齐开销。

        3
  •  1
  •   Buddy    6 年前

    它的参考资料,只是深埋了几个链接: https://en.cppreference.com/w/cpp/language/new

    new(2,f) T; // calls operator new(sizeof(T), 2, f)
            // (C++17) or operator new(sizeof(T), std::align_val_t(alignof(T)), 2, f)
    

    https://www.bfilipek.com/2017/06/cpp17-details-clarifications.html 看起来你真的用了 alignas 关键字,它将自动调用 new .

    推荐文章