C++的单例模式

这篇具有很好参考价值的文章主要介绍了C++的单例模式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

忘记之前有没有写过单例模式了。
再记录一下:
我使用的代码:

#ifndef SINGLETON_MACRO_HPP
#define SINGLETON_MACRO_HPP

#define SINGLETON_DECL(class_name) \
public: \
    static class_name& instance() { \
        static class_name s_instance; \
        return s_instance; \
    } \
private: \
    class_name();\
    class_name(const class_name&) = delete; \
    class_name& operator=(const class_name&) = delete;

#endif // SINGLETON_MACRO_HPP

双锁单例:

#include <iostream>
#include <mutex>

class Singleton {
private:
    static Singleton* instance;
    static std::mutex mtx;

    // 私有化构造函数,确保不能在类外部进行实例化
    Singleton() {}

public:
    // 删除复制构造函数和复制赋值操作符
    Singleton(const Singleton& other) = delete;
    Singleton& operator=(const Singleton& other) = delete;

    static Singleton* getInstance() {
        if (instance == nullptr) { // 判断实例是否已经被创建,提高效率
            std::lock_guard<std::mutex> lock(mtx); // 锁定
            if (instance == nullptr) { // 再次检查,以确保线程安全
                instance = new Singleton();
            }
        }
        return instance;
    }
};

// 初始化静态成员
Singleton* Singleton::instance = nullptr;
std::mutex Singleton::mtx;

int main() {
    Singleton* s1 = Singleton::getInstance();
    Singleton* s2 = Singleton::getInstance();

    if (s1 == s2) {
        std::cout << "Both instances are identical." << std::endl;
    } else {
        std::cout << "Instances are different." << std::endl;
    }

    return 0;
}

单例模式的不同实现方式各有优缺点

双检锁(Double Checked Locking):

优点:
线程安全。
在实例已经被创建之后,直接返回实例,避免了每次获取实例时都需要获取锁的开销。
缺点:
代码相对复杂。
在某些老的编译器或硬件架构上,双检锁可能无法正常工作,可能需要内存屏障或其他同步机制。

静态局部变量(Meyers’ Singleton):
class Singleton {
public:
    static Singleton& getInstance() {
        static Singleton instance;
        return instance;
    }
private:
    Singleton() {}
};

优点:
线程安全(在 C++11 及以后的版本中)。
代码简单、清晰。
延迟初始化:只有在首次调用 getInstance 时,实例才会被创建。
缺点:
对于老的 C++ 标准(C++11 之前),这种方法可能不是线程安全的。

饿汉式:
class Singleton {
private:
    static Singleton instance;
    Singleton() {}
public:
    static Singleton& getInstance() {
        return instance;
    }
};

优点:
线程安全,因为实例在程序开始时就已经被初始化。
代码简单。
缺点:
实例在程序开始时就被创建,即使它从未被使用,可能会导致不必要的资源占用或初始化开销。

懒汉式(简单):
class Singleton {
private:
    static Singleton* instance;
    Singleton() {}
public:
    static Singleton* getInstance() {
        if (!instance) {
            instance = new Singleton();
        }
        return instance;
    }
};

优点:
实现简单。
延迟初始化,只在首次获取实例时创建。
缺点:
非线程安全。如果多个线程同时尝试创建实例,可能导致多个实例被创建。

在实际的使用场景中,要根据具体的需求和上下文来选择合适的实现方法。例如,如果线程安全性很重要,那么使用双检锁或C++11及以后版本的静态局部变量方法可能更合适。

最后问题:我用的是什么模式??文章来源地址https://www.toymoban.com/news/detail-685191.html

到了这里,关于C++的单例模式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 面向对象中的单例模式

    设计模式就是前人根据实际的问题提出的问题解决方案,我们把这种就称之为设计模式。 单例模式是一种常见的设计模式! 所谓的设计模式,不是一种新的语法,而是人们在实际的应用中,面对某种特定的情形而设计出来的某种常见的有效的解决方案,所以,设计模式只是

    2024年02月05日
    浏览(47)
  • Java设计模式中的单例模式

    Java设计模式中的单例模式 单例模式是一种创建型设计模式,其目的是确保一个类只有一个实例,并提供一个全局访问点。 单例模式的两种不同方式 饿汉式单例模式: 懒汉式单例模式: 区别: 饿汉式单例模式(Eager Initialization): 在类加载时就创建实例,因此不存在线程安

    2024年01月24日
    浏览(52)
  • 【多线程】线程安全的单例模式

    单例模式能保证某个类在程序中只存在 唯一 一份实例, 而不会创建出多个实例,从而节约了资源并实现数据共享。 比如 JDBC 中的 DataSource 实例就只需要一个. 单例模式具体的实现方式, 分成 “饿汉” 和 “懒汉” 两种. 类加载的同时, 创建实例. 注意: 使用 static 修饰 instanc

    2024年02月09日
    浏览(44)
  • kotlin实现java的单例模式

    Kotlin的5种单例模式

    2024年02月10日
    浏览(36)
  • [Unity] 单例设计模式, 可供继承的单例组件模板类

    一个可供继承的单例组件模板类: 因为 Unity 是单线程的, 所以在这里没有必要使用双检索 例如你要创建一个全局的单例管理类, 可以这样使用: 尽量避免让 SingletonComponent 帮你创建组件, 因为它只是单纯的将组件创建, 并挂载到空对象上, 而不会进行任何其他行为. 如果你的组件

    2024年02月08日
    浏览(41)
  • 7种创建方式,带你理解Java的单例模式

    本文分享自华为云社区《《Java极简设计模式》第01章:单例模式(Singleton)》,作者:冰 河。 看几个单例对象的示例代码,其中有些代码是线程安全的,有些则不是线程安全的,需要大家细细品味,这些代码也是在高并发环境下测试验证过的。 代码一:SingletonExample1 这个类

    2024年02月12日
    浏览(42)
  • 【谈一谈】: 我们工作中的单例模式有哪些写法?

    我们要实现一个单例,首先最重要的是什么? 当然是把构造函数私有化,变成 private 类型,(为啥? 单例单例,如果谁都能通过构造函数创建对象,还叫单例吗?是不~) 嗯~我们构造函数私有化后,我们应该 操作啥 呢? 接着我们需要提供 一个方法 ,这个方法要保证初始化 有且仅 初始化 一

    2024年02月21日
    浏览(45)
  • 【JAVA】Java 中什么叫单例设计模式?请用 Java 写出线程安全的单例模式

    🍎 个人博客: 个人主页 🏆 个人专栏: JAVA ⛳️   功不唐捐,玉汝于成 目录 前言 正文 懒汉式(Lazy Initialization): 双重检查锁定(Double-Checked Locking): 结语 我的其他博客 在软件设计中,单例设计模式是一种重要的设计思想,它确保了一个类只有一个实例,并提供了一

    2024年01月15日
    浏览(51)
  • 学习系列:5种常见的单例模式变体及其实现方式

    单例模式是一种创建型设计模式,它保证一个类只有一个实例,并提供了一个全局访问点。在实际应用中,我们可能会遇到一些特殊情况,需要对单例模式进行一些变体,以满足不同的需求。下面介绍几种常见的单例模式变体。 1. 懒汉式单例模式 懒汉式单例模式是指在第一

    2024年02月09日
    浏览(46)
  • linux线程池、基于线程池的单例模式、读者写者问题

    线程池: 一种线程使用模式。线程过多会带来调度开销,进而影响缓存局部性和整体性能。而线程池维护着多个线程,等待着监督管理者分配可并发执行的任务。这避免了在处理短时间任务时创建与销毁线程的代价。线程池不仅能够保证内核的充分利用,还能防止过分调度。

    2024年02月03日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包