Apakah ada kasus dunia nyata untuk C ++ tanpa pengecualian? [Tutup]

40

Dalam Kapan menggunakan C lebih dari C ++, dan C ++ lebih dari C? ada wrt pernyataan. untuk pengecualian ukuran kode / C ++:

Jerry menjawab (di antara poin-poin lain):

(...) cenderung lebih sulit untuk menghasilkan executable yang benar-benar kecil dengan C ++. Untuk sistem yang sangat kecil, Anda jarang menulis banyak kode, dan tambahan (...)

yang saya tanyakan mengapa itu terjadi, yang dijawab Jerry:

hal utama adalah bahwa C ++ termasuk penanganan exception, yang (setidaknya biasanya) menambahkan beberapa ukuran minimum ke executable. Sebagian besar kompiler akan memungkinkan Anda menonaktifkan penanganan pengecualian, tetapi ketika Anda melakukan hasilnya tidak cukup C ++ lagi. (...)

yang saya tidak ragu pada tingkat dunia nyata teknis.


Oleh karena itu saya tertarik (murni karena penasaran) untuk mendengar dari contoh dunia nyata di mana proyek memilih C ++ sebagai bahasa dan kemudian memilih untuk menonaktifkan pengecualian. (Bukan hanya sekadar "tidak menggunakan" pengecualian dalam kode pengguna, tetapi nonaktifkan mereka di kompiler, sehingga Anda tidak dapat membuang atau menangkap pengecualian.) Mengapa proyek memilih untuk melakukannya (masih menggunakan C ++ dan bukan C, tetapi tidak ada pengecualian) - apa alasannya (teknis)?


Tambahan: Bagi mereka yang ingin menguraikan jawaban mereka, alangkah baiknya untuk merinci bagaimana implikasi tanpa pengecualian ditangani:

  • Koleksi STL ( vector, ...) tidak berfungsi sebagaimana mestinya (kegagalan alokasi tidak dapat dilaporkan)
  • new tidak bisa melempar
  • Konstruktor tidak dapat gagal
Martin Ba
sumber
1
JSF C ++. Jet dan pengecualian tidak tercampur.
Coder
1
Beberapa info yang mencerahkan tentang masalah dengan pengecualian (dan C ++ secara umum) 250bpm.com/blog:4
Ambroz Bizjak
1
@AmbrozBizjak - Saya akan mengutip DeadMG dari komentar di pos yang Anda tautkan ke: quote: "Sepertinya saya Anda tidak mengerti pengecualian." Saya setuju. Penulis jelas membuat kekacauan penanganan pengecualian, melihat contoh yang dia berikan di pos itu.
Martin Ba

Jawaban:

35

Hampir semua game konsol di luar sana ada di C ++ dengan pengecualian dinonaktifkan, bahkan hari ini. Selain itu, pengaturan default untuk kompiler C ++ menargetkan konsol tersebut. Terkadang beberapa fitur C ++ tidak dijamin berfungsi dengan benar pada kompiler-kompiler itu, seperti multiple inheritance (Saya sedang memikirkan kompiler default konsol yang sangat terkenal misalnya).


Juga, contoh lain adalah perangkat keras Arduino SDK usnig gcc tanpa kecuali diaktifkan di C ++, dan hal-hal lain seperti tidak disediakan STL .


Ada beberapa alasan teknis, baik atau buruk, apa pun, itu bukan saran saya tetapi alasan yang pernah saya dengar:

  1. Kebanyakan konsol adalah sistem yang tertanam dengan memori dan waktu pemrosesan yang terbatas. Mungkin tidak akan begitu benar di konsol masa depan, tetapi yang saat ini masih sangat terbatas dibandingkan dengan PC. Beberapa konsol portabel lebih sulit diprogram daripada smartphone apa pun, misalnya NDS. Fitur pengecualian memang menambah memori dan sedikit biaya kecepatan, bahkan jika Anda tidak menggunakannya. Anda dapat memeriksa diri sendiri, itu benar bahkan di PC.
  2. Permainan video di konsol tidak dapat rusak. Mereka harus diuji dengan cara yang menghindari crash atau jalan buntu, showstoper. Itu sebabnya produsen konsol meminta gim untuk diperiksa sebelum dipublikasikan. Itu juga berarti bahwa manajemen pengecualian menambah biaya yang tidak terlalu berguna untuk konsol game. Lebih baik di smartphone misalnya karena mungkin ada beberapa cara untuk memulihkan atau menambahkan beberapa kode ke email Anda masalah. Platform tertutup seperti kebanyakan konsol tidak mengizinkan ini. Jadi sistem pengecualian sebenarnya tidak diperlukan. Anda "hanya harus membuatnya bekerja dengan benar". ;)
  3. Manajemen pengecualian, ketika Anda tidak mengizinkan kesalahan dan crash, berarti Anda harus menerapkan strategi manajemen kesalahan. Sistem seperti itu mungkin cukup kompleks untuk membuat seseorang bekerja banyak waktu untuk membuatnya berguna. Pengembang game tidak memiliki kemewahan untuk mengerjakan fitur yang dianggap berguna dalam crash ...
  4. Kompiler tidak mengizinkannya (belum). Ya itu terjadi.

Saya pikir pengecualian bisa berguna bahkan di game tapi itu benar bahwa di game konsol itu tidak terlalu berguna.


Memperbarui:

Saya menambahkan contoh mengejutkan lain di sini: LLVM / CLang jangan gunakan pengecualian atau RTTI karena alasan berikut :

Dalam upaya mengurangi kode dan ukuran yang dapat dieksekusi, LLVM tidak menggunakan RTTI (mis. Dynamic_cast <>) atau pengecualian. Dua fitur bahasa ini melanggar prinsip C ++ umum "Anda hanya membayar untuk apa yang Anda gunakan", menyebabkan mengasapi yang dapat dieksekusi bahkan jika pengecualian tidak pernah digunakan dalam basis kode, atau jika RTTI tidak pernah digunakan untuk kelas. Karena itu, kami mematikannya secara global dalam kode.

Yang mengatakan, LLVM benar-benar menggunakan RTTI lintir tangan yang menggunakan templat seperti isa <>, cast <>, dan dyn_cast <>. Bentuk RTTI ini adalah opt-in dan dapat ditambahkan ke kelas apa pun. Ini juga jauh lebih efisien daripada dynamic_cast <>.

CLang terkenal dengan kecepatan kompilasi dan kesalahan eksplisit, tetapi juga salah satu kompiler langka yang memiliki kode yang benar-benar mudah diikuti.

Klaim
sumber
9
(3): Anda memerlukan strategi manajemen kesalahan, apa pun yang terjadi, jika Anda setuju (2). Masalah akan muncul, dan perangkat lunak konsol Anda harus gagal lunak dan anggun. Tidak jelas bagi saya bahwa menghindari pengecualian sepenuhnya membuat hal itu lebih mudah.
David Thornley
6
Semua contoh hebat lingkungan runtime yang dikontrol ketat di mana kesalahan ditangani dengan benar dan tidak ada peristiwa "luar biasa".
Patrick Hughes
1
@ Davidvidhorn Karena Anda berasumsi bahwa sistem konsol akan mengelola beberapa jenis kesalahan, tetapi itu tidak akan terjadi. Yah mungkin itu akan di PS3 atau XBox tapi itu tidak akan diizinkan untuk lulus tes pembangun konsol. Bagaimanapun, firmware dari sebagian besar konsol canggih tidak sefleksibel yang Anda kira. Gim konsol harus memiliki akses ke hampir semua perangkat keras konsol, sehingga Anda dapat berpikir tentang gim yang berjalan di konsol hampir seperti jika itu juga merupakan "OS" dari konsol ... semakin banyak kita memiliki konsol yang kuat, semakin sedikit itu benar. Jadi saya setuju dengan Anda bahwa tampaknya aneh untuk beberapa kasus.
Klaim
2
Ini adalah jawaban yang baik, saya juga ingin menambahkan bahwa bahkan jika pengecualian muncul dan memberikan kesalahan kepada pengguna, apa yang harus dia lakukan dengan D-pad? Satu-satunya solusi nyata bagi pengguna akhir adalah restart.
anon
2
Saya menghapus contoh kebodohan karena seseorang di tim mereka mengatakan pada peningkatan TANPA PENGECUALIAN tidak berarti "tidak menggunakan pengecualian" tetapi "tidak ada pengecualian pada aturan". Lihat permalink.gmane.org/gmane.comp.lib.boost.devel/231377
Klaim
9

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.

justin
sumber
+1 info bagus! (walaupun saya tidak setuju dengan paragraf Kesederhanaan)
Martin Ba
Akan menarik jika Anda hanya memiliki konstruktor yang tidak gagal dan bagaimana Anda menangani alokasi (- kegagalan).
Martin Ba
@ Martin 1) Tidak setuju cukup baik. Saya mengerti bahwa sebagian besar pengembang tidak setuju dengan menonaktifkan pengecualian karena berbagai alasan. Untuk kesederhanaan, ini sejalan dengan kebenaran program. Masalah / keadaan tidak valid tidak diizinkan melakukan perjalanan jauh. Itu berarti mereka memeriksa kegagalan dan keluar dengan anggun. Posting jheriko menggemakan ini.
justin
1
@Martin 2b) alokasi sedikit lebih kompleks. Pertama, jumlah alokasi tumpukan berkurang jumlahnya dan bertambah besar - ada relatif sedikit alokasi tumpukan untuk memulai. Kedua, alokasi dilakukan melalui pengalokasi khusus. Jika alokasi pada awalnya tidak disediakan untuk pengalokasi (misalnya mallocpengembalian 0), pengalokasi memasuki while (1)yang memiliki konteks switch, diikuti oleh upaya lain pada alokasi. Dalam basis kode ini, dulu yang baru melalui pengalokasi dapat mengembalikan 0, tetapi implementasi yang lebih baru telah berfungsi dengan baik. (lanjutan)
justin
2
ya, ada pembungkus yang kompatibel dengan stl di atas antarmuka pengalokasi khusus. secara teknis, program tidak akan dibatalkan dalam rilis; itu akan memperkenalkan sakelar konteks (mis. memungkinkan utas lain berfungsi yang diharapkan akan membebaskan sebagian memori), coba lagi, dan login jika gagal - selamanya. unit test dapat berjalan selama berhari-hari tanpa masalah. satu-satunya ancaman nyata adalah alokasi yang sangat besar, banyak di antaranya akan ditangkap sebelum diminta. sekali lagi, tingkat kegagalan sistem juga ada di radar pada saat ini; ada kemungkinan bahwa mereka akan gagal sebelum implementasi inti dalam skenario seperti itu.
justin
7

Google tidak menyetujui pengecualian dalam Panduan Gaya C ++ mereka , sebagian besar karena alasan historis:

Di wajah mereka, manfaat menggunakan pengecualian lebih besar daripada biayanya, terutama dalam proyek-proyek baru. Namun, untuk kode yang ada, pengenalan pengecualian memiliki implikasi pada semua kode dependen. Jika pengecualian dapat diperbanyak di luar proyek baru, itu juga menjadi masalah untuk mengintegrasikan proyek baru ke dalam kode bebas pengecualian yang ada. Karena sebagian besar kode C ++ yang ada di Google tidak siap untuk menangani pengecualian, relatif sulit untuk mengadopsi kode baru yang menghasilkan pengecualian.

Mengingat bahwa kode Google yang ada tidak toleran terhadap pengecualian, biaya untuk menggunakan pengecualian agak lebih besar daripada biaya dalam proyek baru. Proses konversi akan lambat dan rawan kesalahan. Kami tidak percaya bahwa alternatif yang tersedia untuk pengecualian, seperti kode kesalahan dan pernyataan, menimbulkan beban yang signifikan.

Saran kami untuk tidak menggunakan pengecualian tidak didasarkan pada alasan filosofis atau moral, tetapi saran praktis. Karena kami ingin menggunakan proyek open-source kami di Google dan sulit untuk melakukannya jika proyek-proyek itu menggunakan pengecualian, kami perlu memberi saran terhadap pengecualian dalam proyek open-source Google juga. Segalanya mungkin akan berbeda jika kita harus mengulanginya dari awal lagi.

Ada pengecualian untuk aturan ini (tidak ada permainan kata pun) untuk kode Windows.

(Penekanan editor)

SuperElectric
sumber
5

Qt hampir tidak pernah menggunakan pengecualian. Kesalahan dalam Qt ditandai dengan kode dan sinyal kesalahan. Alasan yang dinyatakan secara resmi adalah:

Ketika Qt dimulai, pengecualian tidak tersedia untuk semua kompiler yang perlu didukung oleh Qt. Hari ini kami berusaha menjaga agar API tetap konsisten, sehingga modul yang memiliki riwayat tidak menggunakan pengecualian umumnya tidak akan mendapatkan kode baru menggunakan pengecualian yang ditambahkan.

Mengapa QT menggunakan sangat sedikit pengecualian?

Saat ini, satu kritik umum terhadap Qt adalah bahwa pengecualian keamanannya tidak lengkap.

pengguna16764
sumber
1
Terima kasih. Info bagus, walaupun saya bertanya-tanya apakah sebagian besar basis kode QT mungkin memiliki pengecualian yang diaktifkan di kompiler ...
Martin Ba
4

Symbian C ++ (digunakan pada beberapa ponsel Nokia) tidak menggunakan pengecualian, setidaknya tidak secara langsung, karena kompiler C ++ tidak dapat mengimplementasikannya dengan andal ketika Symbian pertama kali dikembangkan.

Keith Thompson
sumber
1
Ini tidak berlaku untuk versi modern Symbian. TRAP dan daun Symbian diimplementasikan sebagai pengecualian C ++ nyata , tetapi EPOC32 dan versi Symbian yang lebih lama memang mengandalkan cara lain (setjmp / longjmp jika saya ingat dengan benar).
otto
1
@ OttoHarju: Itulah yang saya maksud dengan "setidaknya tidak secara langsung".
Keith Thompson
3

Saya / tidak pernah / menggunakan pengecualian. Ada sejumlah alasan untuk ini, tetapi dua alasan utama adalah bahwa saya tidak pernah membutuhkan mereka untuk menghasilkan kode yang kuat dan bahwa mereka mengurangi kinerja saat runtime.

Saya telah bekerja pada kode produksi yang menggunakan dan menonaktifkan pengecualian - kode yang memungkinkan pengecualian secara keseluruhan lebih buruk. Di beberapa tempat pengecualian digunakan untuk kontrol aliran asli daripada penanganan kesalahan, yang sangat berat, anti-kinerja, dan sulit untuk di-debug. Secara umum masalah debugging dalam pengecualian kode diisi lebih sulit daripada dalam kode bebas pengecualian - sebagian turun ke tumpukan dan kesulitan intrinsik dari mekanisme pengecualian, tetapi lebih dari itu karena kode malas yang didorong sebagai hasil dari memiliki penanganan eksepsi yang tersedia.

Tidak ada yang salah dengan pengecualian itu sendiri / jika Anda tidak peduli dengan kinerja / dan tidak punya waktu untuk melakukan sesuatu dengan benar - mereka adalah fitur bahasa untuk penanganan kesalahan dan pengganti yang baik untuk mekanisme penanganan kesalahan yang tepat. Namun, hampir selalu / lebih baik / cara untuk menangani kesalahan - seperti dengan logika Anda sendiri (sulit untuk diuraikan tentang ini - itu hampir masuk akal). Jika ini bukan kesalahan Anda, tetapi berasal dari perpustakaan (mis. Perpustakaan standar) maka Anda harus menghormati pilihan pengecualian atau mengalami kerusakan, tapi saya selalu mempertanyakan pilihan itu. Saya belum pernah melihat situasi di mana pengecualian sebenarnya adalah solusi terbaik.

Pernyataan lebih debuggable, kode kesalahan kurang berat ... antara keduanya, jika digunakan dengan benar, Anda lebih mudah membaca, men-debug, dan memelihara kode yang lebih cepat. Menang semua ...

jheriko
sumber
1
Nggak. Lebih mudah untuk menyalahgunakan pengecualian, tetapi selain itu pengecualian berfungsi dengan baik. Paling tidak itu mudah untuk dipikirkan, asalkan semua fungsi Anda adalah pengecualian-aman (dan itu biasanya hanya masalah menggunakan RTTI untuk semua sumber daya, yang harus Anda lakukan pula). Melakukan kode kesalahan dengan benar bisa sangat menjemukan, dan bisa mengakibatkan mengubur program Anda di tumpukan kode penanganan kesalahan; dalam hal itu, pengecualian lebih baik. Ingat, saya melakukan hal-hal yang berbeda dari Anda bukanlah bukti konklusif bahwa saya tidak peduli melakukan sesuatu dengan benar.
David Thornley
... seperti mengapa RTTI itu buruk, itu adalah cerita lain - RTTI bawaan di setiap kompiler yang saya lihat bisa dikalahkan secara sepele - jika Anda bahkan membutuhkan RTTI. Ini semua tentang konteks - hal-hal ini seperti RTTI dan pengecualian bisa bagus untuk RAD dan aplikasi perusahaan - mereka tidak memiliki tempat di dunia komputasi kinerja tinggi (misalnya game). Saya belum pernah melihat mesin permainan produksi menggunakan target mana pun di mana mereka dapat dimatikan ...
jheriko
2
Maaf - RAII yang saya maksud. Jika Anda tidak menggunakannya, maka tidak hanya pengecualian yang akan kacau. (Namun, gips dinamis bekerja dengan sangat baik dalam pekerjaan saya, dan saya harus peduli dengan kinerja.)
David Thornley
Topik menarik: Saya pikir pengecualian memungkinkan kesalahan penanganan kode yang lebih ringkas tetapi kode kesalahan lebih kuat karena mereka memungkinkan untuk menangani kesalahan secara lokal (Anda dapat memeriksa kode kembali segera di pemanggil sementara pengecualian dapat menggelembungkan tumpukan-panggilan sebelum ditangkap dan kadang-kadang mereka tidak tertangkap, menghasilkan crash. Kecuali jika Anda menggunakan catch (...)).
Giorgio
3

Dalam standar pengkodean Joint Strike Fighter C ++ oleh Bjarne et. al., pengecualian dilarang, karena persyaratan real-time jet tempur yang keras.

JSF ++ ditujukan untuk aplikasi waktu sulit dan penting untuk keselamatan (perangkat lunak kontrol penerbangan). Jika perhitungan terlalu lama, seseorang mungkin mati. Karena alasan itu, kami harus menjamin waktu respons, dan kami tidak bisa - dengan tingkat dukungan alat saat ini - melakukannya untuk pengecualian. Dalam konteks itu, bahkan alokasi toko gratis dilarang! Sebenarnya, rekomendasi JSF ++ untuk penanganan kesalahan mensimulasikan penggunaan pengecualian untuk mengantisipasi hari di mana kita memiliki alat untuk melakukan hal-hal yang benar, yaitu menggunakan pengecualian.

Dikutip dari FAQ C ++ Bjarne .

Ingat, C ++ mungkin menjalankan berbagai perangkat lunak terluas dari semua bahasa ...

Macke
sumber
JSF ++ juga melarang penggunaan "baru" (selain penempatan baru) dan "hapus". Yang merupakan satu jawaban untuk pertanyaan "bagaimana Anda menangani kegagalan baru tanpa pengecualian"
armb
@armb: Ya. Lihat "Dalam konteks itu, bahkan alokasi toko gratis dilarang!" atas.
Macke
2

Ini agak penting dalam desain perpustakaan C ++. Sering kali dengan antarmuka-C itu agak tidak enak untuk membuang pengecualian dari perpustakaan pihak ke-3 Anda ke klien. Intinya adalah bahwa jika perpustakaan Anda melempar, Anda memotong satu set klien yang akan menggunakannya, mengingat bahwa itu memiliki jaminan tanpa-lemparan (untuk alasan apa pun yang dimiliki klien untuk pembatasan pengecualian).

Secara pribadi saya telah melihat pengecualian dilecehkan ketika tim disuruh "melempar pengecualian" setiap kali sesuatu yang tidak begitu mengerikan terjadi. Tentu saja Anda melihat kesalahan di sini - pengecualian dilemparkan ke dalam kode sebelum ada yang tahu apa yang harus dilakukan dengannya. Proyek itu mengalami beberapa crash karena deep-throws ini akan keluar sesekali.

segera
sumber
1

Mungkin dalam hal ini, ada baiknya menyebutkan Embedded C ++ . Embedded C ++ adalah varian dari C ++ yang dirancang (cukup jelas) untuk sistem embedded. Ini pada dasarnya bagian yang tepat dari C ++, dengan (antara lain) template, ruang nama, dan penanganan pengecualian dihapus.

Saya harus menambahkan bahwa sementara EC ++ membuat sedikit percikan ketika masih baru, mereka tampaknya sebagian besar sudah cukup sepi. Saya tidak yakin apakah orang kehilangan minat, atau upaya pertama mereka begitu sempurna sehingga tidak ada yang melihat alasan untuk mengacaukannya selama satu dekade atau lebih.<closed captioning for the humor impaired>Yeah, right!</closed captioning>

Jerry Coffin
sumber
Mencari Q&A - caravan.net/ec2plus/question.html - saya akan mengatakan itu sudah cukup mati.
Martin Ba
1

Contoh yang bagus adalah pemrograman mode kernel.

Anda dapat menggunakan C ++ di sana untuk kode pembersih tetapi tanpa pengecualian. Tidak ada perpustakaan runtime untuk mereka dan penanganan pengecualian menggunakan memori stack terlalu banyak yang sangat terbatas di kernel (saya bereksperimen dengan pengecualian C ++ di kernel Windows NT dan pengecualian melempar dan melepaskan makan setengah dari stack yang tersedia - sangat mudah untuk mendapatkan stack overflow dan crash seluruh sistem).

Biasanya Anda menentukan operator newdan deleteoperator Anda. Saya juga menemukan placement newreferensi nilai a dan c ++ 11 yang sangat berguna . STL atau pustaka mode pengguna C ++ lainnya yang bergantung pada pengecualian dapat digunakan.

Sergius
sumber
0

Ketika Anda mencoba untuk menjaga memori yang dapat dieksekusi. Biasanya dilakukan pada sistem embedded (atau seluler). Untuk aplikasi desktop namun tidak diperlukan di server, ini mungkin dipertimbangkan jika Anda ingin ram sebanyak mungkin untuk server web atau untuk sql.


sumber