gpt4 book ai didi

c++ - 在声明或实现中延迟初始化 C++ 单例

转载 作者:搜寻专家 更新时间:2023-10-31 02:10:33 25 4
gpt4 key购买 nike

我知道单例模式通常被认为是糟糕的设计,因此不鼓励,但这个问题涉及实现方面,而不是单例模式的适当性。

考虑以下三种使用延迟初始化的 C++ 单例实现:

1:使用指针,声明和实现分离

单例.hpp:

class Singleton {
public:
static Singleton* instance();
private:
Singleton() {}
static Singleton* singleton;
};

单例.cpp:

Singleton* Singleton::singleton = nullptr;

Singleton* Singleton::instance() {
if( nullptr == singleton ) {
singleton = new Singleton();
}
return singleton;
}

2:使用引用,拆分声明和实现

单例.hpp:

class Singleton {
public:
static Singleton& instance();
private:
Singleton() {}
};

单例.cpp:

Singleton& Singleton::instance() {
static Singleton singleton;
return singleton;
}

3:使用引用,在声明中内联

单例.hpp:

class Singleton {
public:
static Singleton& instance() {
static Singleton singleton;
return singleton;
}
private:
Singleton() {}
}

我个人喜欢并使用第三个版本。但是有什么充分的理由更喜欢第一个或第二个版本吗?

据我了解,在第三个版本中,每个包含 Singleton.hpp 的翻译单元都有一个对象实例,然后链接器会选择一个。这会导致任何副作用吗?

在共享库中使用第三个是否有任何副作用?

奖励问题:哪个实现实际上是“Meyer 的单例”?

最佳答案

第一个不是线程安全的。

 if( nullptr == singleton ) {
singleton = new Singleton();
}

可能会出现多个线程执行分配语句并造成内存泄漏的情况。

第二个和第三个是线程安全的自 C++11 ,因为:

If multiple threads attempt to initialize the same static local variable concurrently, the initialization occurs exactly once (similar behavior can be obtained for arbitrary functions with std::call_once).

来自 here .

我更喜欢第三个,因为内联优化更有可能。

关于c++ - 在声明或实现中延迟初始化 C++ 单例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45053688/

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