C++单利模式常见问题

C++语言是一门具有面向对象的高性能语言,其执行效率不小于C语言的80%。所以在现在的深度学习中被广泛使用,深度学习在跑的实例需要大量的计算资源,算法在实现上又要实现模型的抽象。综合考虑,C++是其载体的不二之选,模型验证可以使用更加方便的python等高级语言,方便修改和编写简单。实际在工程中使用的还是以C++作为模型的载体来实现算法。

C++是一门结合高性能和具有面向对象抽象的语言,同比其他语言具有这么多的优点,为什么其他语言没有达到?以我的观点,正是因为需要运行高性能使得他的写法更偏向C,且没有自动内存管理等优点,写出的代码健壮性在初级或者中级开发人员手中不容易保证,所以在实际业务方面使用的会很少,再比如java,虽然性能比C++低,但是从初级或者中级开发人员手中写出的代码无论从风格统一还是健壮性上来看,都远远高于C++的版本。也正是因为C++的具有的这些特点,所以其语法和各个知识点都需要开发人员无比细致的知晓,比如单例模式的应用。在我们实际用到单例模式的时候,往往觉得单例很简单。无非是将构造函数私有化,然后提供一个全局的静态类方法来进行访问该类的资源。但是在我们实际工程中,对此还是需要有一定的原理了解。

在我公司实际项目中使用单例是一种非常普遍的事。但是不是每个人都能了解到其中的细节,有可能会对整个工程都带来灾难性的影响。

在下面列举两个不同单例的写法,看上去类似,但是实际上有着很不同的作用。

代码A:


class classForSingleton3
{
public:
    static classForSingleton3 *getClassForSingleton3()
    {

        static classForSingleton3 *m = 0;
        if (m == 0)
        {
            m = new classForSingleton3();
        }
        return m;
    }

private:
    classForSingleton3();
};

代码B:


class classForSingleton4
{
public:
    static classForSingleton4 *getClassForSingleton4()
    {
        static classForSingleton4 m;
        return &m;
    }

private:
    classForSingleton4();
};

以上两种都是单例的写法,在实现上是达成了一致的效果,这个类无法被外部初始化,只能通过get方法获取。

但是在实际运用上是有差异的,代码A的单例并不是线程安全的写法,代码B才是线程安全的写法。

原因有这么几点:

1 一个类实例的构造函数是符合原子特性,只有执行完了,才有进入的可能。这一点,我在很多C++编程相关的书上都没有找到介绍。例如有一个类实例叫做a,a在使用的时候,会是多线程环境中使用,初始化的的时候,必定是在某一个线程中做的,而不是两个线程都做一遍。

2 代码A是先生成一个匿名实例,然后将匿名实例赋值给了函数内静态变量m,构造函数实际没有与m发生关联,在实际运行过程中,该构造函数可能会被同时调用两次。这一点我已经在下方提供的代码中证明过。

3 代码B构造函数是与函数内静态变量m发生直接关系,依据类的构造函数原子性原理,该实例只会生成一份。且执行一次,是目前最安全的解决方式。

4 十分推荐单例获取函数写在cpp文件中。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值