Aracılığıyla paylaş


/Zc:alignedNew (C++17 üzerine hizalanmış ayırma)

C++17 üzerine hizalanmış, maksimum boyutlu standart hizalanmış newtürü max_align_tiç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 Exampleolduğunda bile hizalamasını dikkate max_align_t alır. Ayrılan türün hizalaması özgün işleci newtarafı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*, align_val_t)çağrılır::operator delete(void*, size_t, 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 newdelete geri dönmek için öğesini belirtin/std:c++17./Zc:alignedNew- İşleci uygularsanız ve new ancak parametresi olan aşırı hizalanmış işleci delete ve new aşırı yüklemeleri delete 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ınalign_val_t./Zc:alignedNew- seçeneği /permissive- varsayılan ayarını /Zc:alignedNewdeğ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

  1. Projenin Özellik Sayfaları iletişim kutusunu açın. Ayrıntılar için bkz . Visual Studio'da C++ derleyicisi ve derleme özelliklerini ayarlama.

  2. > Komut Satırı özellik sayfasını seçin.

  3. Ek Seçenekler özelliğini veya içerecek /Zc:alignedNew şekilde değiştirin ve ardından Tamam'ı/Zc:alignedNew-.

Ayrıca bkz.

/Zc (Uyumluluk)