Bagikan melalui


/Zc:alignedNew (Alokasi C++17 yang terlalu rata)

Aktifkan dukungan untuk C++17 over-aligned new, alokasi memori dinamis yang selaras pada batas yang lebih besar dari default untuk jenis rata standar berukuran maksimum, max_align_t.

Sintaks

/Zc:alignedNew[-]

Keterangan

Pengkompilasi dan pustaka MSVC mendukung alokasi memori dinamis standar C++17 yang terlalu selaras. /Zc:alignedNew Ketika opsi ditentukan, alokasi dinamis seperti new Example; menghormati perataan Example bahkan ketika lebih besar dari max_align_t, perataan terbesar yang diperlukan untuk jenis dasar apa pun. Ketika perataan jenis yang dialokasikan tidak lebih dari perataan yang dijamin oleh operator newasli , tersedia sebagai nilai makro __STDCPP_DEFAULT_NEW_ALIGNMENT__yang telah ditentukan sebelumnya , pernyataan new Example; menghasilkan panggilan ke ::operator new(size_t) seperti yang terjadi di C++14. Ketika perataan lebih besar dari __STDCPP_DEFAULT_NEW_ALIGNMENT__, implementasinya malah mendapatkan memori dengan menggunakan ::operator new(size_t, align_val_t). Demikian pula, penghapusan jenis yang terlalu selaras ::operator delete(void*, align_val_t) memanggil atau tanda tangan ::operator delete(void*, size_t, align_val_t)penghapusan berukuran .

Opsi /Zc:alignedNew ini hanya tersedia ketika /std:c++17 atau yang lebih baru diaktifkan. Di bawah /std:c++17 atau yang lebih baru, /Zc:alignedNew diaktifkan secara default agar sesuai dengan standar C++. Jika satu-satunya alasan Anda menerapkan operator new dan delete mendukung alokasi yang terlalu selaras, Anda mungkin tidak lagi memerlukan kode ini dalam mode C++17 atau yang lebih baru. Untuk menonaktifkan opsi ini dan kembali ke perilaku C++14 dan newdelete saat Anda menggunakan /std::c++17 atau yang lebih baru, tentukan /Zc:alignedNew-. Jika Anda menerapkan operator new dan delete tetapi Anda belum siap untuk mengimplementasikan operator new yang terlalu selaras dan delete kelebihan beban yang memiliki align_val_t parameter , gunakan /Zc:alignedNew- opsi untuk mencegah kompilator dan Pustaka Standar menghasilkan panggilan ke kelebihan beban yang terlalu selaras. Opsi /permissive- tidak mengubah pengaturan /Zc:alignedNewdefault .

Dukungan untuk /Zc:alignedNew tersedia mulai di Visual Studio 2017 versi 15.5.

Contoh

Sampel ini menunjukkan bagaimana operator new dan operator delete berperilaku /Zc:alignedNew saat opsi diatur.

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

Output ini khas untuk build 32-bit. Nilai pointer bervariasi berdasarkan tempat aplikasi Anda berjalan dalam memori.

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

Untuk informasi tentang masalah kesuaian di Visual C++, lihat Perilaku Nonstandar.

Untuk mengatur opsi pengkompilasi ini di lingkungan pengembangan Visual Studio

  1. Buka kotak dialog Halaman Properti proyek. Untuk detailnya, lihat Mengatur pengkompilasi C++ dan membuat properti di Visual Studio.

  2. Pilih halaman properti Properti>Konfigurasi C/C++>Baris Perintah.

  3. Ubah properti Opsi Tambahan untuk disertakan /Zc:alignedNew atau /Zc:alignedNew- lalu pilih OK.

Baca juga

/Zc (Kesuaian)