gpt4 book ai didi

C++ 单例实现Meyer's vs call_once

转载 作者:行者123 更新时间:2023-12-02 02:27:25 24 4
gpt4 key购买 nike

嗯,我在自己的项目中使用单例。最常用的单例实现可能是 Meyer 的单例以及使用 std::call_once 或 pthread_once 的单例实现。它们对于并行计算都是线程安全的

//Meyer's singleton
class MySingleton{
public:
static MySingleton& getInstance(){
static MySingleton instance;
// volatile int dummy{};
return instance;
}
private:
MySingleton()= default;
~MySingleton()= default;
MySingleton(const MySingleton&)= delete;
MySingleton& operator=(const MySingleton&)= delete;

};


//with call_once
class MySingleton{
public:
static MySingleton& getInstance(){
std::call_once(initInstanceFlag, &MySingleton::initSingleton);
// volatile int dummy{};
return *instance;
}
private:
MySingleton()= default;
~MySingleton()= default;
MySingleton(const MySingleton&)= delete;
MySingleton& operator=(const MySingleton&)= delete;

static MySingleton* instance;
static std::once_flag initInstanceFlag;

static void initSingleton(){
instance= new MySingleton;
}
};

MySingleton* MySingleton::instance= nullptr;
std::once_flag MySingleton::initInstanceFlag;

Meyer的实现使用局部静态变量来保证线程安全并返回实例标识,而后者通过call_once实现并返回一个指针。在我的实验中,迈耶的实现速度更快一些。但是大多数项目使用 call_once 方法来实现最基本的单例实现,尽管项目的一些小组件使用 Meyer 的实现。我只是想知道有什么原则可以遵循吗?这两种不同的实现有何优缺点?

最佳答案

call_once 版本保留指向实例的指针并使用new 创建它。由于从未在指针上调用过删除操作,因此如果需要在实例析构函数中运行合理的代码,则此解决方案会带来一些麻烦。除了进程退出时烦人的悬空指针之外,如果实例析构函数只是像您的示例中那样的默认析构函数,则可以考虑使用它。

关于C++ 单例实现Meyer's vs call_once,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58336155/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com