Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimanakah Pengecualian Beroperasi Secara Dalaman dalam C?

Bagaimanakah Pengecualian Beroperasi Secara Dalaman dalam C?

Linda Hamilton
Linda Hamiltonasal
2024-10-24 07:32:02133semak imbas

How Do Exceptions Operate Internally in C  ?

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:

  • __cxa_throw mesti mencari pengendali dan melepaskan tindanan.
  • Pengecualian yang diperuntukkan mesti dimusnahkan selepas pengendali dilaksanakan .

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:

  1. Melemparkan Pengecualian:

    _Z20my_throwing_functionb:
     ...
     movl    , (%esp)
     call    __cxa_allocate_exception
     ...
     movl    %eax, (%esp)
     call    __cxa_throw
     ...
  2. Jadual Pengendalian Pengecualian:

    .section    .gcc_except_table,&quot;a&quot;,@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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn