Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
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 auf das C++14-Verhalten new zurücksetzen möchten, geben delete Sie an, wann oder höher Sie /std:c++17verwenden/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
Ö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).
Klicken Sie auf der Eigenschaftenseite auf Konfigurationseigenschaften>C/C++>Befehlszeile.
Ändern Sie die oder
/Zc:alignedNewauszuwählen, und wählen Sie dann "OK/Zc:alignedNew-.