簡體   English   中英

如何在`C++17`中調用重載對齊的new和delete運算符?

[英]How to call the overloaded aligned new and delete operators in `C++17`?

cppreference我們可以看到newdelete幾個新重載,以及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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM