Udostępnij za pośrednictwem


/Zc:alignedNew (Alokacja wyrównana w języku C++17)

Włącz obsługę nadmiernego wyrównania neww języku C++17, alokacji pamięci dynamicznej wyrównanej do granic większej niż wartość domyślna dla typu zgodnego ze standardem o maksymalnym rozmiarze, max_align_t.

Składnia

/Zc:alignedNew[-]

Uwagi

Kompilator I biblioteka MSVC obsługują standardową alokację pamięci dynamicznej w standardzie C++17. Po określeniu /Zc:alignedNew opcji alokacja dynamiczna, taka jak new Example; uwzględnia wyrównanie Example nawet wtedy, gdy jest większe niż max_align_t, największe wyrównanie wymagane dla dowolnego typu podstawowego. Gdy wyrównanie przydzielonego typu nie jest większe niż wyrównanie gwarantowane przez oryginalny operator new, dostępne jako wartość wstępnie zdefiniowanego makra __STDCPP_DEFAULT_NEW_ALIGNMENT__instrukcja new Example; powoduje wywołanie ::operator new(size_t) metody tak jak w języku C++14. Gdy wyrównanie jest większe niż __STDCPP_DEFAULT_NEW_ALIGNMENT__, implementacja zamiast tego uzyskuje pamięć przy użyciu polecenia ::operator new(size_t, align_val_t). Podobnie usunięcie nadmiernie wyrównanych typów wywołuje ::operator delete(void*, align_val_t) lub rozmiaru usuń podpis ::operator delete(void*, size_t, align_val_t).

Opcja /Zc:alignedNew jest dostępna tylko wtedy, gdy /std:c++17 jest włączona lub nowsza. W obszarze /std:c++17 lub nowszym /Zc:alignedNew jest domyślnie włączona zgodność ze standardem C++. Jeśli jedynym powodem implementacji operatora new i delete jest obsługa nadmiernie wyrównanych alokacji, ten kod może nie być już potrzebny w trybach C++17 lub nowszych. Aby wyłączyć tę opcję i przywrócić zachowanie języka C++14 i delete w przypadku użycia /std::c++17 lub nowszegonew, określ wartość /Zc:alignedNew-. Jeśli implementujesz operator new i delete nie jesteś gotowy do zaimplementowania new operatora i przeciążeń, które mają align_val_t parametr , delete użyj /Zc:alignedNew- opcji, aby zapobiec generowaniu wywołań do przeciążeń wyrównanych przez kompilator i bibliotekę Standardowa. Opcja /permissive- nie zmienia domyślnego ustawienia ./Zc:alignedNew

/Zc:alignedNew Obsługa programu jest dostępna od wersji 15.5 programu Visual Studio 2017.

Przykład

W tym przykładzie pokazano, jak działa operator new i operator delete po ustawieniu /Zc:alignedNew opcji.

// 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;
}

Te dane wyjściowe są typowe dla kompilacji 32-bitowych. Wartości wskaźnika różnią się w zależności od tego, gdzie aplikacja działa w pamięci.

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

Aby uzyskać informacje na temat problemów ze zgodnością w programie Visual C++, zobacz Zachowanie niezgodne.

Aby ustawić tę opcję kompilatora w środowisku programowania Visual Studio

  1. Otwórz okno dialogowe Strony właściwości projektu. Aby uzyskać szczegółowe informacje, zobacz Set C++ compiler and build properties in Visual Studio (Ustawianie właściwości kompilatora języka C++ i kompilowania w programie Visual Studio).

  2. Wybierz stronę Właściwości>konfiguracji C/C++>Wiersza polecenia.

  3. Zmodyfikuj właściwość Opcje dodatkowe, aby uwzględnić /Zc:alignedNew lub/Zc:alignedNew-, a następnie wybierz przycisk OK.

Zobacz też

/Zc (Zgodność)