Sdílet prostřednictvím


/Zc:alignedNew (Přidělení zarovnané zarovnané do C++17)

Povolte podporu zarovnaného dynamického přidělení paměti zarovnaného newdo 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 newdelete 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

  1. Otevřete dialogové okno Stránky vlastností projektu. Podrobnosti najdete v tématu Nastavení kompilátoru C++ a vlastností sestavení v sadě Visual Studio.

  2. Vyberte stránku vlastností příkazového řádku C/C++>Vlastnosti>konfigurace.

  3. Upravte vlastnost Další možnosti tak, aby zahrnovala /Zc:alignedNew nebo /Zc:alignedNew- a pak zvolte OK.

Viz také

/Zc (shoda)