Bagaimana Pengecualian Berfungsi di Sebalik Tabir dalam C
Pengenalan:
Pengecualian sering dipersoalkan untuk kecekapan mereka. Artikel ini meneroka kerja rumit pengecualian dalam C untuk memberikan pemahaman menyeluruh tentang proses pelaksanaannya.
Mekanisme Pengendalian Pengecualian:
Pengecualian tidak secara langsung serupa dengan pelaksanaan berulang kali pulangan; ia melibatkan lapisan tambahan jadual pengecualian. Apabila pengecualian dilemparkan, pengkompil menjana panggilan ke __cxa_throw, yang menggunakan jadual ini untuk mencari pengendali dan melonggarkan tindanan sehingga ia mencapai pengendali yang sesuai.
Melempar Pengecualian:
Melontar pengecualian memerlukan overhed masa jalan yang ketara kerana:
Pulangan Luar Biasa:
Sebaliknya, pengembalian nilai memerlukan overhed minimum. Pengecualian harus digunakan dengan berhati-hati, hanya untuk senario yang luar biasa.
Kod Contoh:
Kod C ringkas berikut menggambarkan penjanaan arahan untuk pengendalian pengecualian:
<code class="cpp">class MyException { public: MyException() { } ~MyException() { } }; void my_throwing_function(bool throwit) { if (throwit) throw MyException(); } void another_function(); void log(unsigned count); void my_catching_function() { log(0); try { log(1); another_function(); log(2); } catch (const MyException& e) { log(3); } log(4); }</code>
Perhimpunan Dijana:
Menyusun kod ini dengan GCC di Linux menghasilkan output pemasangan berikut:
Melemparkan Pengecualian:
_Z20my_throwing_functionb: ... movl , (%esp) call __cxa_allocate_exception ... movl %eax, (%esp) call __cxa_throw ...
Jadual Pengendalian Pengecualian:
.section .gcc_except_table,"a",@progbits .LLSDATT9: ... .uleb128 .LEHB1-.LFB9 .uleb128 .LEHE1-.LEHB1 .uleb128 .L12-.LFB9 .uleb128 0x1 ...
Kesimpulan:
Pengecualian memerlukan banyak overhed untuk pengendalian dan pelepasan, manakala nilai pulangan menanggung perbelanjaan yang minimum. Pengecualian adalah optimum untuk senario yang luar biasa, tetapi harus digunakan dengan bijak untuk mengelakkan kemerosotan prestasi.
Atas ialah kandungan terperinci Bagaimanakah Pengecualian Beroperasi Secara Dalaman dalam C?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!