Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk Mencapai Go-Style Defer dalam C Tanpa Mengorbankan Prestasi?

Bagaimana untuk Mencapai Go-Style Defer dalam C Tanpa Mengorbankan Prestasi?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-11-02 21:06:30408semak imbas

How to Achieve Go-Style Defer in C   Without Sacrificing Performance?

Tangguhkan Pelaksanaan dalam C

Konsep penangguhan gaya Go, yang membolehkan pembersihan sumber yang bersih dan ringkas, telah mendapat populariti dalam C . Walau bagaimanapun, mencari pelaksanaan pustaka standard atau disokong baik untuk ciri ini boleh menjadi mencabar.

Walaupun tiada sokongan terbina dalam untuk penangguhan dalam Pustaka Templat Standard (STL) atau Boost, terdapat pelaksanaan luaran yang tersedia . Satu pelaksanaan sedemikian ialah penyelesaian sifar overhed yang ringan:

<code class="cpp">#ifndef defer
struct defer_dummy {};
template <class F> struct deferrer { F f; ~deferrer() { f(); } };
template <class F> deferrer<F> operator*(defer_dummy, F f) { return {f}; }
#define DEFER_(LINE) zz_defer##LINE
#define DEFER(LINE) DEFER_(LINE)
#define defer auto DEFER(__LINE__) = defer_dummy{} *[&amp;]()
#endif // defer</code>

Pelaksanaan ini memerlukan persediaan yang minimum dan boleh disepadukan dengan mudah ke dalam pangkalan kod anda. Sintaksnya adalah mudah:

<code class="cpp">defer { statements; };</code>

Sebagai contoh, dalam coretan kod berikut, operasi fclose dilaksanakan secara automatik apabila skop fungsi read_entire_file dikeluarkan:

<code class="cpp">auto file = std::fopen(filename, "rb");
if (!file)
    return false;

defer { std::fclose(file); }; // don't need to write an RAII file wrapper.

// ...</code>

Sifar ini -pelaksanaan overhed menawarkan cara yang mudah dan cekap untuk mengurus pembersihan sumber dalam C , menyediakan ciri penangguhan Go-like tanpa memerlukan kelas RAII yang kompleks atau teknik pengurusan memori tersuai.

Atas ialah kandungan terperinci Bagaimana untuk Mencapai Go-Style Defer dalam C Tanpa Mengorbankan Prestasi?. 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