Как вызвать перегруженные выровненные операторы new и delete в `C ++ 17`? - PullRequest
0 голосов
/ 04 ноября 2018

Из cppreference мы можем видеть несколько новых перегрузок new и delete, а также new[] и delete[]. Я не могу найти никаких примеров использования с новыми выровненными перегрузками, ни по cppreference, ни где-либо еще. Я экспериментировал с ними в течение достаточно долгого времени, и я не могу найти, как вызвать эти выровненные динамически распределенные вызовы. У кого-нибудь есть идеи, пожалуйста, поделитесь примером.

Ответы [ 2 ]

0 голосов
/ 04 ноября 2018

Вам необходимо указать ключевое слово align as для вашего типа, а затем просто вызвать new и удалить как обычно. Я собрал статью с примерами об этом здесь: 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 >());
}

И пример с компилятором Intel, который в настоящее время делает эту функцию доступной через заголовок расширения align_new: https://software.intel.com/en-us/articles/aligned-operator-new-support-in-intel-c-compiler

0 голосов
/ 04 ноября 2018

Он находится на 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://www.bfilipek.com/2017/06/cpp17-details-clarifications.html Похоже, вы на самом деле используете ключевое слово alignas, и оно автоматически вызовет новое new.

...