/Zc:alignedNew (избыточное выделение C++17)

Включите поддержку чрезмерного выравнивания newC++17, динамическое выделение памяти, выровненное по границам, превышающим значение по умолчанию для типа, выровненного по стандарту максимального размера, max_align_t.

Синтаксис

/Zc:alignedNew[-]

Комментарии

Поддержка компилятором и библиотекой MSVC стандартного выделения памяти с избыточным выравниванием C++17. При указании /Zc:alignedNew параметра динамическое выделение, например new Example; , учитывает выравнивание, даже если оно больше max_align_t, что является наибольшим выравниванием, необходимым для любого фундаментального Example типа. Если выравнивание выделенного типа не превышает выравнивание, гарантированное исходным оператором new, доступным в качестве значения предопределенного макроса __STDCPP_DEFAULT_NEW_ALIGNMENT__, инструкция new Example; приводит к вызову ::operator new(size_t) , как это было в C++14. Если выравнивание больше __STDCPP_DEFAULT_NEW_ALIGNMENT__, реализация получает память с помощью ::operator new(size_t, align_val_t). Аналогичным образом удаление типов с избыточным выравниванием вызывает ::operator delete(void*, align_val_t) или сигнатуру удаления ::operator delete(void*, size_t, align_val_t) с определенным размером.

Параметр /Zc:alignedNew доступен только при /std:c++17 включении или более поздней версии. В или /std:c++17 более поздней версии /Zc:alignedNew параметр включен по умолчанию для соответствия стандарту C++. Если единственной причиной реализации оператора new и delete является поддержка чрезмерно выровненных выделений, этот код может больше не понадобиться в режимах C++17 или более поздних версий. Чтобы отключить этот параметр и вернуться к поведению new C++14 и delete при использовании /std::c++17 или более поздней версии, укажите /Zc:alignedNew-. Если вы реализуете оператор new и delete не готовы к реализации чрезмерного выравнивания оператора new и delete перегрузки с параметром align_val_t , используйте /Zc:alignedNew- параметр , чтобы предотвратить компилятор и стандартную библиотеку от создания вызовов к перегрузкам с превышением выравнивания. Параметр /permissive- не изменяет значение /Zc:alignedNewпо умолчанию .

/Zc:alignedNew Поддержка доступна начиная с Visual Studio 2017 версии 15.5.

Пример

В этом примере показано поведение оператора new и оператора delete при /Zc:alignedNew установке параметра.

// alignedNew.cpp
// Compile by using: cl /EHsc /std:c++17 /W4 alignedNew.cpp
#include <iostream>
#include <malloc.h>
#include <new>

// "old" unaligned overloads
void* operator new(std::size_t size) {
    auto ptr = malloc(size);
    std::cout << "unaligned new(" << size << ") = " << ptr << '\n';
    return ptr ? ptr : throw std::bad_alloc{};
}

void operator delete(void* ptr, std::size_t size) {
    std::cout << "unaligned sized delete(" << ptr << ", " << size << ")\n";
    free(ptr);
}

void operator delete(void* ptr) {
    std::cout << "unaligned unsized delete(" << ptr << ")\n";
    free(ptr);
}

// "new" over-aligned overloads
void* operator new(std::size_t size, std::align_val_t align) {
    auto ptr = _aligned_malloc(size, static_cast<std::size_t>(align));
    std::cout << "aligned new(" << size << ", " <<
        static_cast<std::size_t>(align) << ") = " << ptr << '\n';
    return ptr ? ptr : throw std::bad_alloc{};
}

void operator delete(void* ptr, std::size_t size, std::align_val_t align) {
    std::cout << "aligned sized delete(" << ptr << ", " << size <<
        ", " << static_cast<std::size_t>(align) << ")\n";
    _aligned_free(ptr);
}

void operator delete(void* ptr, std::align_val_t align) {
    std::cout << "aligned unsized delete(" << ptr <<
        ", " << static_cast<std::size_t>(align) << ")\n";
    _aligned_free(ptr);
}

struct alignas(256) OverAligned {}; // warning C4324, structure is padded

int main() {
    delete new int;
    delete new OverAligned;
}

Такой результат является типичным для 32-разрядных сборок. Значения указателя могут варьироваться в зависимости от того, где приложение выполняется в памяти.

unaligned new(4) = 009FD0D0
unaligned sized delete(009FD0D0, 4)
aligned new(256, 256) = 009FE800
aligned sized delete(009FE800, 256, 256)

Сведения о вопросах соответствия в Visual C++ см. в статье Nonstandard Behavior.

Установка данного параметра компилятора в среде разработки Visual Studio

  1. Откройте диалоговое окно Страницы свойств проекта. Подробнее см. в статье Настройка компилятора C++ и свойства сборки в Visual Studio.

  2. Выберите страницу свойствC/C++>Command Lineсвойства> конфигурации.

  3. Измените свойство Дополнительные параметры , включив /Zc:alignedNew или /Zc:alignedNew- , а затем нажмите кнопку ОК.

См. также раздел

/Zc (соответствие)