/Zc:alignedNew
(Přidělení zarovnané zarovnané do C++17)
Povolte podporu zarovnaného dynamického přidělení paměti zarovnaného new
do C++17 na hranicích větších než výchozí hodnota pro standardní zarovnaný typ maximální velikosti. max_align_t
Syntaxe
/Zc:alignedNew
[-
]
Poznámky
Kompilátor MSVC a knihovna podporují přidělení dynamické paměti zarovnané standardem C++17. /Zc:alignedNew
Pokud je tato možnost zadána, dynamické přidělení, jako new Example;
je třeba respektovat zarovnáníExample
, i když je větší než max_align_t
, největší zarovnání vyžadované pro jakýkoli základní typ. Pokud zarovnání přiděleného typu není více než zarovnání zaručené původním operátorem new
, k dispozici jako hodnota předdefinovaného makra __STDCPP_DEFAULT_NEW_ALIGNMENT__
, výsledkem příkazu new Example;
je volání ::operator new(size_t)
tak, jak to bylo v jazyce C++14. Pokud je zarovnání větší než __STDCPP_DEFAULT_NEW_ALIGNMENT__
, implementace místo toho získá paměť pomocí ::operator new(size_t, align_val_t)
. Podobně odstranění přerovnaných typů vyvolá ::operator delete(void*, align_val_t)
nebo velikost odstranit podpis ::operator delete(void*, size_t, align_val_t)
.
Tato /Zc:alignedNew
možnost je dostupná jenom v případech, kdy /std:c++17
je povolená nebo novější. /Zc:alignedNew
Ve /std:c++17
výchozím nastavení je ve výchozím nastavení povolená odpovídající standardu jazyka C++. Pokud implementujete new
delete
operátor a je jediným důvodem, proč podporuje přidělení zarovnané nadrovnané, nemusíte tento kód potřebovat v režimech C++17 nebo novějších. Chcete-li tuto možnost vypnout a vrátit se k chování jazyka new
C++14 a delete
při použití /std::c++17
nebo novějším, zadejte /Zc:alignedNew-
. Pokud implementujete operátor new
a delete
nejste připraveni implementovat přerovnaný operátor new
a delete
přetížení s align_val_t
parametrem, použijte /Zc:alignedNew-
možnost zabránit kompilátoru a standardní knihovně generovat volání přerovnaných přetížení. Možnost /permissive-
nezmění výchozí nastavení /Zc:alignedNew
.
/Zc:alignedNew
Podpora je dostupná od sady Visual Studio 2017 verze 15.5.
Příklad
Tato ukázka ukazuje, jak se operátor new
a operátor delete
chovají při /Zc:alignedNew
nastavení možnosti.
// 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;
}
Tento výstup je typický pro 32bitové sestavení. Hodnoty ukazatele se liší v závislosti na tom, kde aplikace běží v paměti.
unaligned new(4) = 009FD0D0
unaligned sized delete(009FD0D0, 4)
aligned new(256, 256) = 009FE800
aligned sized delete(009FE800, 256, 256)
Informace o problémech s dodržováním předpisů v jazyce Visual C++ naleznete v tématu Nestandardní chování.
Nastavení tohoto parametru kompilátoru ve vývojovém prostředí Visual Studio
Otevřete dialogové okno Stránky vlastností projektu. Podrobnosti najdete v tématu Nastavení kompilátoru C++ a vlastností sestavení v sadě Visual Studio.
Vyberte stránku vlastností příkazového řádku C/C++>Vlastnosti>konfigurace.
Upravte vlastnost Další možnosti tak, aby zahrnovala
/Zc:alignedNew
nebo/Zc:alignedNew-
a pak zvolte OK.