/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 new
asli , 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 new
delete
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:alignedNew
default .
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
Buka kotak dialog Halaman Properti proyek. Untuk detailnya, lihat Mengatur pengkompilasi C++ dan membuat properti di Visual Studio.
Pilih halaman properti Properti>Konfigurasi C/C++>Baris Perintah.
Ubah properti Opsi Tambahan untuk disertakan
/Zc:alignedNew
atau/Zc:alignedNew-
lalu pilih OK.