[英]c++17: which versions of global operators new/delete must be replaced at least to cover all cases?
[英]How to call the overloaded aligned new and delete operators in `C++17`?
从cppreference我们可以看到new
和delete
几个新重载,以及new[]
和delete[]
被添加。 我在 cppreference 或其他任何地方都找不到任何使用新对齐重载的示例。 我已经对它们进行了一段时间的试验,但我不知道如何触发这些对齐的动态分配的调用。 任何人都有任何想法,请分享一个例子。
您需要在类型上指定 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 >());
}
以及英特尔编译器的示例,该编译器当前通过aligned_new 扩展标头提供此功能: https ://software.intel.com/en-us/articles/aligned-operator-new-support-in-intel-c-compiler
我想问题是如何显式调用重载的new
,而到目前为止所有的答案都建议如何隐式调用。
我的解决方案(浮动对齐到 256 字节边界):
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 (“新表达式”)并导航到“Placement new”部分:
如果提供了placement_params,它们将作为附加参数传递给分配函数
就是这样!
嗯,差不多。 这里: https : //en.cppreference.com/w/cpp/memory/new/operator_new我们读到:
这些分配函数由 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!!!
丑陋而危险,尤其是在类似数组的版本中,因为它没有与请求元素数量相对应的参数的位置——它所需要的只是要分配的字节数,这可能需要考虑一些对齐高架。
它在 cppreference 上,只是深埋了几个链接: 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 : alignas
看起来您实际上使用了alignas
关键字,它会自动调用新的new
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.