Bagikan melalui


/Zc:throwingNew (Mengasumsikan lemparan baru operator)

Ketika opsi /Zc:throwingNew ditentukan, pengkompilasi mengoptimalkan panggilan untuk operator new melewati pemeriksaan untuk pengembalian pointer null. Opsi ini memberi tahu pengkompilasi untuk mengasumsikan bahwa semua implementasi tertaut dan operator new alokator kustom sesuai dengan standar C++ dan membuang kegagalan alokasi. Secara default di Visual Studio, kompilator secara pesimis menghasilkan pemeriksaan null (/Zc:throwingNew-) untuk panggilan ini, karena pengguna dapat menautkan dengan implementasi non-throwing atau operator new menulis rutinitas alokator kustom yang mengembalikan pointer null.

Sintaks

/Zc:throwingNew[-]

Keterangan

Sejak ISO C++98, standar telah menentukan bahwa operator default baru melempar std::bad_alloc saat alokasi memori gagal. Versi Visual C++ hingga Visual Studio 6.0 mengembalikan pointer null pada kegagalan alokasi. Dimulai di Visual Studio 2002, operator new sesuai dengan standar dan melemparkan kegagalan. Untuk mendukung kode yang menggunakan gaya alokasi yang lebih lama, Visual Studio menyediakan implementasi operator new yang dapat ditautkan di nothrownew.obj yang mengembalikan pointer null pada kegagalan. Secara default, kompilator juga menghasilkan pemeriksaan null defensif untuk mencegah alokator gaya lama ini menyebabkan crash segera pada kegagalan. Opsi /Zc:throwingNew memberi tahu pengkompilasi untuk meninggalkan pemeriksaan null ini, dengan asumsi bahwa semua alokator memori yang ditautkan sesuai dengan standar. Ini tidak berlaku untuk kelebihan beban non-pelemparan operator new eksplisit, yang dinyatakan dengan menggunakan parameter tambahan jenis std::nothrow_t dan memiliki spesifikasi eksplisit noexcept .

Secara konseptual, untuk membuat objek di penyimpanan gratis, pengkompilasi menghasilkan kode untuk mengalokasikan memorinya dan kemudian memanggil konstruktornya untuk menginisialisasi memori. Karena kompilator MSVC biasanya tidak dapat mengetahui apakah kode ini akan ditautkan ke alokator yang tidak sesuai dan tidak melempar, secara default juga menghasilkan pemeriksaan null sebelum memanggil konstruktor. Ini mencegah dereferensi pointer null dalam panggilan konstruktor jika alokasi non-throwing gagal. Dalam kebanyakan kasus, pemeriksaan ini tidak perlu, karena alokator default operator new melempar alih-alih mengembalikan pointer null. Pemeriksaan juga memiliki efek samping yang tidak menguntungkan. Mereka membanjiri ukuran kode, mereka membanjiri prediktor cabang, dan mereka menghambat pengoptimalan kompilator berguna lainnya seperti devirtualisasi atau penyebaran kontras keluar dari objek yang diinisialisasi. Pemeriksaan hanya ada untuk mendukung kode yang menautkan ke nothrownew.obj atau memiliki implementasi kustom yang tidak sesuai operator new . Jika Anda tidak menggunakan non-sesuai , kami sarankan operator newAnda menggunakan /Zc:throwingNew untuk mengoptimalkan kode Anda.

Opsi /Zc:throwingNew nonaktif secara default, dan tidak terpengaruh oleh opsi /permissive- .

Jika Anda mengkompilasi dengan menggunakan pembuatan kode waktu tautan (LTCG), Anda tidak perlu menentukan /Zc:throwingNew. Saat kode Anda dikompilasi dengan menggunakan LTCG, pengkompilasi dapat mendeteksi apakah default, implementasi yang operator new sesuai digunakan. Jika demikian, pengkompilasi meninggalkan pemeriksaan null secara otomatis. Linker mencari bendera /ThrowingNew untuk mengetahui apakah implementasinya operator new sesuai. Anda dapat menentukan bendera ini ke linker dengan menyertakan arahan ini di sumber untuk implementasi baru operator kustom Anda:

#pragma comment(linker, "/ThrowingNew")

Untuk informasi selengkapnya 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. Dari menu drop-down Konfigurasi , pilih Semua Konfigurasi.

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

  4. Ubah properti Opsi Tambahan untuk menyertakan /Zc:throwingNew atau /Zc:throwingNew- lalu pilih OK.

Baca juga

Opsi Pengkompilasi MSVC
Sintaks Baris Perintah Pengkompilasi MSVC
/Zc (Kesuaian)
noexcept (C++)
Spesifikasi Pengecualian (throw) (C++)
mengakhiri (pengecualian)