Jerry mengatakan: ... hasilnya tidak cukup C ++ lagi , sementara metafora saya adalah bahwa hal itu adalah jelas C ++, hanya sedikit berbeda dialek karena program memanfaatkan bentuk-bentuk lain, konvensi, dan gaya tertulis.
Berikut adalah alasan utama saya untuk menonaktifkannya:
Kompatibilitas Biner
Batas lintas bahasa dan terjemahan tidak secara universal didefinisikan dengan baik, atau tidak ditentukan. Jika Anda ingin menjamin program Anda beroperasi dalam domain perilaku yang ditentukan, Anda harus mengkarantina pengecualian di titik keluar modul.
Ukuran yang Dapat Dieksekusi
Berikut adalah ukuran biner dari program bebas pengecualian yang saya tulis, dibuat tanpa dan dengan pengecualian yang diaktifkan:
Tanpa pengecualian:
- + dependensi yang dapat dieksekusi: 330
- executable stripped akhir (rilis rilis): 37
Dengan pengecualian:
- + dependensi yang dapat dieksekusi: 380
- executable stripped akhir (rilis build): 44
Pengingat: Itu adalah koleksi perpustakaan dan program yang mengandung nol lemparan / tangkapan. Compiler bendera tidak memungkinkan pengecualian dalam C ++ perpustakaan standar. Oleh karena itu, biaya di dunia nyata lebih dari 19% terlihat dalam contoh ini.
Kompiler: apple gcc4.2 + llvm. Ukuran dalam MB.
Kecepatan
Terlepas dari istilah "pengecualian biaya nol", mereka masih menambahkan beberapa biaya overhead bahkan ketika tidak ada yang melempar. Dalam kasus di atas, ini adalah program kritis kinerja (Pemrosesan Sinyal, Pembuatan, Penyajian, Konversi, dengan set / sinyal data besar, dll.). Pengecualian bukan fitur yang diperlukan dalam desain ini, sementara kinerja sangat penting.
Kebenaran Program
Sepertinya alasan aneh ... Jika melempar bukan pilihan, Anda harus menulis program yang relatif ketat, benar, teruji dengan baik untuk menjamin program Anda dieksekusi dengan benar, dan bahwa klien menggunakan antarmuka dengan benar (jika Anda memberi saya argumen yang buruk atau melakukan tidak memeriksa kode kesalahan, maka Anda layak mendapatkan UB). Hasil? Kualitas implementasi sangat meningkat dan masalah diperbaiki dengan cepat.
Kesederhanaan
Implementasi penanganan pengecualian sering tidak diperbarui. Mereka juga menambahkan banyak kompleksitas karena implementasi dapat memiliki banyak banyak sekuens keluar. Lebih mudah untuk membaca dan memelihara program yang sangat kompleks ketika mereka menggunakan sekumpulan kecil strategi keluar yang diketik dengan baik yang diketik dan ditangani oleh klien. Dalam kasus lain, implementasi mungkin dari waktu ke waktu menerapkan lebih banyak lemparan atau ketergantungan mereka dapat memperkenalkan mereka. Klien tidak dapat dengan mudah atau tepat mempertahankan terhadap semua pintu keluar ini. Saya menulis dan memperbarui banyak perpustakaan, sering ada evolusi dan peningkatan. Mencoba untuk menjaga agar semuanya tetap selaras dengan urutan keluar pengecualian (dalam basis kode besar) tidak akan menjadi penggunaan waktu yang baik, dan kemungkinan akan menambah banyak kebisingan dan cacat. Karena peningkatan kebenaran program dan lebih banyak tes,
Sejarah / Kode yang Ada
Dalam beberapa kasus, mereka tidak pernah diperkenalkan karena alasan historis. Basis kode yang ada tidak menggunakannya, mengubah program bisa memakan waktu bertahun-tahun dan membuatnya sangat jelek untuk dipelihara karena tumpang tindih dalam konvensi dan implementasi.
Kerugian
Tentu saja, ada kelemahannya, yang terbesar adalah: Incompatability (termasuk. Binary) dengan perpustakaan lain, dan fakta bahwa Anda harus mengimplementasikan sejumlah program yang baik agar sesuai dengan model ini.