Dela via


/Zc:alignedNew (C++17 överjusterad allokering)

Aktivera stöd för överjusterad newC++17, dynamisk minnesallokering justerad efter gränser som är större än standardvärdet för den standardjusterade standardtypen, max_align_t.

Syntax

/Zc:alignedNew[-]

Anmärkningar

MSVC-kompilatorn och biblioteket stöder C++17 standardöverjusterad dynamisk minnesallokering. När alternativet /Zc:alignedNew har angetts respekterar en dynamisk allokering, till exempel new Example; justeringen av Example även när den är större än max_align_t, den största justering som krävs för någon grundläggande typ. När justeringen av den allokerade typen inte är mer än den justering som garanteras av den ursprungliga operatorn new, tillgänglig som värdet för det fördefinierade makrot __STDCPP_DEFAULT_NEW_ALIGNMENT__, resulterar instruktionen new Example; i ett anrop till ::operator new(size_t) som det gjorde i C++14. När justeringen är större än __STDCPP_DEFAULT_NEW_ALIGNMENT__hämtar implementeringen i stället minnet med hjälp ::operator new(size_t, align_val_t)av . På samma sätt anropar ::operator delete(void*, align_val_t) borttagning av överjusterade typer eller borttagningssignaturen ::operator delete(void*, size_t, align_val_t)för storleken .

Alternativet /Zc:alignedNew är endast tillgängligt när /std:c++17 eller senare är aktiverat. Under /std:c++17 eller senare /Zc:alignedNew är aktiverat som standard för att överensstämma med C++-standarden. Om den enda anledningen till att du implementerar operatorn new och delete är att stödja överjusterade allokeringar kanske du inte längre behöver den här koden i C++17- eller senare lägen. Om du vill inaktivera det här alternativet och återgå till C++14-beteendet för new och delete när du använder /std:c++17 eller senare anger du /Zc:alignedNew-. Om du implementerar operatorn new och delete men inte är redo att implementera den överjusterade operatorn new och delete överlagringar som har parametern align_val_t använder du /Zc:alignedNew- alternativet för att förhindra att kompilatorn och standardbiblioteket genererar anrop till överjusterade överlagringar. Alternativet /permissive- ändrar inte standardinställningen /Zc:alignedNewför .

Stöd för /Zc:alignedNew är tillgängligt från och med Visual Studio 2017 version 15.5.

Exempel

Det här exemplet visar hur operatorn new och operatorn delete beter sig när alternativet /Zc:alignedNew anges.

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

Dessa utdata är typiska för 32-bitarsversioner. Pekarvärdena varierar beroende på var programmet körs i minnet.

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

Information om efterlevnadsproblem i Visual C++finns i Icke-standardbeteende.

Ange det här kompilatoralternativet i Visual Studio-utvecklingsmiljön

  1. Öppna dialogrutan egenskapssidor för projektet. Mer information finns i Ange C++-kompilator- och byggegenskaper i Visual Studio.

  2. Välj egenskapssidan Konfigurationsegenskaper>C/C++>kommandorad.

  3. Ändra egenskapen Ytterligare alternativ för att inkludera /Zc:alignedNew eller /Zc:alignedNew- och välj sedan OK.

Se även

/Zc (Överensstämmelse)