Rumah >pembangunan bahagian belakang >C++ >Adakah Meyers' Lazy Initialized Singleton Pelaksanaan Benar-benar Singleton?

Adakah Meyers' Lazy Initialized Singleton Pelaksanaan Benar-benar Singleton?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-12-12 17:33:11210semak imbas

Is Meyers' Lazy Initialized Singleton Implementation Truly a Singleton?

Pelaksanaan Tunggal Meyers: Menyingkap Kesendirian

Soalan:

Bagaimana keadaan Meyers' pelaksanaan yang dimulakan malas bagi Singleton dalam C , seperti yang dilihat di bawah, sebenarnya Singleton corak?

static Singleton& instance()
{
     static Singleton s;
     return s;
}

Jawapan:

Untuk memahami Singletonness pelaksanaan Meyers, adalah penting untuk mengenali ciri utama: tempoh storan statik.

Dalam C , pembolehubah tempatan yang diisytiharkan dalam fungsi mempunyai tempoh storan statik jika ia diisytiharkan statik. Ini bermakna hanya satu contoh pembolehubah itu wujud untuk keseluruhan program, tidak kira berapa kali fungsi dipanggil.

Dalam pelaksanaan Meyers, pembolehubah Singleton statik mempunyai tempoh storan statik. Oleh itu, hanya satu contoh Singleton boleh dibuat, menguatkuasakan corak Singleton.

Untuk memberikan pemahaman yang lebih jelas, mari kita pecahkan kod di bawah hud:

// Global guard variable
static bool __guard = false;

// Static storage for the Singleton
static char __storage[sizeof(Singleton)];

Singleton& Instance() {
  if (!__guard) {
    __guard = true;
    new (__storage) Singleton();
  }
  return *reinterpret_cast<Singleton*>(__storage);
}

Pelaksanaan ini ialah serupa dengan cadangan asal Meyers tetapi termasuk mekanisme keselamatan benang. Pembolehubah __guard memastikan bahawa Singleton dimulakan sekali sahaja, walaupun jika diakses serentak daripada berbilang urutan.

Perbandingan dengan Pelaksanaan Lain:

Berbanding dengan pelaksanaan Singleton yang lain, Meyers ' versi menawarkan kebaikan berikut dan keburukan:

Kebaikan:

  • Mudah dan berkesan: Kesederhanaannya menjadikannya mudah difahami dan dilaksanakan.
  • Selamat untuk benang: Pelaksanaan termasuk mekanisme untuk mengendalikan akses serentak dengan selamat.

Keburukan:

  • Permulaan malas: Singleton dicipta hanya apabila ia pertama kali diminta, yang boleh memperkenalkan overhed prestasi.
  • Isu kemusnahan yang berkemungkinan: Sebagai Singleton adalah statik, ia mungkin tidak akan dimusnahkan serta-merta apabila tidak diperlukan lagi, berpotensi membawa kepada kebocoran memori.

Kesimpulan:

Singleton yang dimulakan dengan malas Meyers pelaksanaan memanfaatkan tempoh storan statik untuk memastikan bahawa hanya satu contoh Singleton wujud sepanjang program, menjadikannya corak Singleton yang sah. Walaupun pelaksanaan lain mungkin menawarkan kelebihan dari segi prestasi atau pengurusan memori, versi Meyers kekal sebagai reka bentuk Singleton yang boleh dipercayai dan digunakan secara meluas.

Atas ialah kandungan terperinci Adakah Meyers' Lazy Initialized Singleton Pelaksanaan Benar-benar Singleton?. 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