/Zc:alignedNew (C++17 überbündige Zuordnung)

Aktivieren Sie die Unterstützung für die überbündete newund dynamische Speicherzuweisung in C++17, die an Begrenzungen ausgerichtet ist, die größer als der Standardwert für den standard ausgerichteten Standardtyp max_align_tsind.

Syntax

/Zc:alignedNew[-]

Hinweise

Der MSVC-Compiler und die -Bibliothek unterstützten die dynamische Speicherzuteilung für C++17 mit erweiterter Ausrichtung. Wenn die /Zc:alignedNew Option angegeben wird, berücksichtigt eine dynamische Zuordnung, z new Example; . B. die Ausrichtung Example , auch wenn sie größer als max_align_tist, die größte Ausrichtung, die für einen beliebigen grundlegenden Typ erforderlich ist. Wenn die Ausrichtung des zugewiesenen Typs nicht mehr als die vom ursprünglichen Operator newgarantierte Ausrichtung ist , die als Wert des vordefinierten Makros __STDCPP_DEFAULT_NEW_ALIGNMENT__verfügbar ist, führt die Anweisung new Example; zu einem Aufruf ::operator new(size_t) wie in C++14. Wenn die Ausrichtung größer als __STDCPP_DEFAULT_NEW_ALIGNMENT__ist, ruft die Implementierung stattdessen den Arbeitsspeicher mithilfe ::operator new(size_t, align_val_t)von . Ebenso werden ::operator delete(void*, align_val_t) oder die Löschsignatur mit angegebener Größe (::operator delete(void*, size_t, align_val_t)) aufgerufen, wenn Typen mit erweiterter Ausrichtung gelöscht werden.

Die /Zc:alignedNew Option ist nur verfügbar, wenn /std:c++17 oder höher aktiviert ist. Unter /std:c++17 oder höher /Zc:alignedNew ist standardmäßig die Übereinstimmung mit dem C++-Standard aktiviert. Wenn Sie den Operator new nur implementieren und delete überlastete Zuordnungen unterstützen möchten, benötigen Sie diesen Code möglicherweise nicht mehr im C++17- oder höher-Modus. Wenn Sie diese Option deaktivieren und das C++14-Verhalten new von und delete bei Verwendung /std::c++17 oder höher rückgängig machen möchten, geben Sie folgendes an/Zc:alignedNew-. Wenn Sie den Operator new implementieren und delete aber nicht bereit sind, den überbündeten Operator new und delete die Überladungen mit dem align_val_t Parameter zu implementieren, verwenden Sie die /Zc:alignedNew- Option, um zu verhindern, dass der Compiler und die Standardbibliothek Aufrufe für die überausrichteten Überladungen generieren. Die /permissive- Option ändert nicht die Standardeinstellung von /Zc:alignedNew.

Unterstützung für /Zc:alignedNew ist ab Visual Studio 2017, Version 15.5, verfügbar.

Beispiel

In diesem Beispiel wird gezeigt, wie sich Operator new und Operator delete verhalten, wenn die /Zc:alignedNew Option festgelegt ist.

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

Diese Ausgabe ist typisch für 32-Bit-Builds. Die Zeigerwerte variieren je nach Ausführungsort Ihrer Anwendung im Speicher.

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

Weitere Informationen über Konformitätsprobleme in Visual C++ finden Sie unter Nicht dem Standard entsprechendes Verhalten.

So legen Sie diese Compileroption in der Visual Studio-Entwicklungsumgebung fest

  1. Öffnen Sie das Dialogfeld Eigenschaftenseiten des Projekts. Weitere Informationen erhalten Sie unter Set C++ compiler and build properties in Visual Studio (Festlegen der Compiler- und Buildeigenschaften (C++) in Visual Studio).

  2. Klicken Sie auf der Eigenschaftenseite auf Konfigurationseigenschaften>C/C++>Befehlszeile.

  3. Ändern Sie die Eigenschaft "Zusätzliche Optionen", um sie einzuschließen /Zc:alignedNew oder /Zc:alignedNew- auszuwählen, und wählen Sie dann "OK" aus.

Siehe auch

/Zc (Übereinstimmung)