![](/img/trans.png)
[英]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.