/Zc:alignedNew
(C++17 üzerine hizalanmış ayırma)
C++17 üzerine hizalanmış, maksimum boyutlu standart hizalanmış new
türü max_align_t
için varsayılandan daha büyük sınırlara hizalanmış dinamik bellek ayırma desteğini etkinleştirin.
Sözdizimi
/Zc:alignedNew
[-
]
Açıklamalar
MSVC derleyicisi ve kitaplığı C++17 standart aşırı hizalanmış dinamik bellek ayırmayı destekler. seçeneği belirtildiğinde/Zc:alignedNew
, gibi new Example;
bir dinamik ayırma, herhangi bir temel tür için gereken en büyük hizalama olan değerinden büyük max_align_t
olduğunda bile hizalamasını dikkate Example
alır. Ayrılan türün hizalaması özgün işleci new
tarafından garanti edilen hizalamadan fazla olmadığında, önceden tanımlanmış makronun __STDCPP_DEFAULT_NEW_ALIGNMENT__
değeri olarak kullanılabilir, deyimi new Example;
C++14'te olduğu gibi çağrısıyla ::operator new(size_t)
sonuçlanır. Hizalama değerinden __STDCPP_DEFAULT_NEW_ALIGNMENT__
büyük olduğunda, uygulama bunun yerine kullanarak ::operator new(size_t, align_val_t)
belleği alır. Benzer şekilde, aşırı hizalanmış türlerin silinmesi veya boyutlu silme imzası ::operator delete(void*, size_t, align_val_t)
çağrılır::operator delete(void*, align_val_t)
.
Bu /Zc:alignedNew
seçenek yalnızca veya daha sonraki bir sürüm etkinleştirildiğinde /std:c++17
kullanılabilir. altında /std:c++17
veya daha sonraki bir sürümde, /Zc:alignedNew
C++ standardına uyacak şekilde varsayılan olarak etkinleştirilir. İşleci new
uygulamanız ve delete
aşırı hizalanmış ayırmaları desteklemenin tek nedeni bu koda artık C++17 veya sonraki modlarda ihtiyacınız olmayabilir. Bu seçeneği kapatmak ve veya daha sonraki bir sürümü kullandığınızda C++14 davranışına new
delete
geri dönmek için öğesini belirtin/Zc:alignedNew-
./std::c++17
İşleci uygularsanız ve delete
ancak parametresi olan aşırı hizalanmış işleci new
ve delete
aşırı yüklemeleri align_val_t
uygulamaya hazır değilseniz, derleyicinin ve Standart Kitaplığın aşırı hizalanmış aşırı yüklemelere çağrılar oluşturmasını önlemek için seçeneğini kullanın/Zc:alignedNew-
.new
seçeneği /permissive-
varsayılan ayarını /Zc:alignedNew
değiştirmez.
desteği /Zc:alignedNew
Visual Studio 2017 sürüm 15.5'den itibaren kullanılabilir.
Örnek
Bu örnek, seçenek ayarlandığında işleç new
ve işlecin delete
nasıl davrandığını /Zc:alignedNew
gösterir.
// 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;
}
Bu çıkış 32 bit derlemeler için tipiktir. İşaretçi değerleri, uygulamanızın bellekte çalıştığı yere göre değişir.
unaligned new(4) = 009FD0D0
unaligned sized delete(009FD0D0, 4)
aligned new(256, 256) = 009FE800
aligned sized delete(009FE800, 256, 256)
Visual C++'daki uyumluluk sorunları hakkında bilgi için bkz . Standart Dışı Davranış.
Bu derleyici seçeneğini Visual Studio geliştirme ortamında ayarlamak için
Projenin Özellik Sayfaları iletişim kutusunu açın. Ayrıntılar için bkz . Visual Studio'da C++ derleyicisi ve derleme özelliklerini ayarlama.
Yapılandırma Özellikleri>C/C++>Komut Satırı özellik sayfasını seçin.
Ek Seçenekler özelliğini veya içerecek
/Zc:alignedNew-
/Zc:alignedNew
şekilde değiştirin ve ardından Tamam'ı seçin.