/Zc:alignedNew
(избыточное выделение C++17)
Включите поддержку чрезмерного выравнивания new
C++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
Откройте диалоговое окно Страницы свойств проекта. Подробнее см. в статье Настройка компилятора C++ и свойства сборки в Visual Studio.
Выберите страницу свойствC/C++>Command Lineсвойства> конфигурации.
Измените свойство Дополнительные параметры , включив
/Zc:alignedNew
или/Zc:alignedNew-
, а затем нажмите кнопку ОК.