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 max_align_tolduğunda bile hizalamasını dikkate Example 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*, 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: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. Yapılandırma Özellikleri>C/C++>Komut Satırı özellik sayfasını seçin.

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

Ayrıca bkz.

/Zc (Uyumluluk)