gpt4 book ai didi

c++ - 引用单例是在栈上还是在堆上?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:53:06 24 4
gpt4 key购买 nike

我在这里阅读了很多关于单例的文章,但没有一篇真正触及我的问题。我知道单例只应在需要时使用,并且在我的游戏中,我将它们用于引擎的特定部分。

也就是说,我最初将我的单例作为这样的指针:

static MapReader* Instance()
{
if (instance == 0)
{
instance = new MapReader();
return instance;
}
return instance;
}

但是我总是觉得使用太多指针对泄漏不利,如果可以的话我宁愿不使用它们(如果必须的话,我宁愿不使用它们(或智能指针)。所以我将我所有的单例更改为这样的引用:

static MapReader& Instance()
{
static MapReader instance;
return instance;
}

但是,现在我注意到我的游戏有时会滞后,然后会加速,就像 FPS 有点不稳定一样。

我的问题是;引用单例是否都堆积在堆栈上?或者他们仍然在堆上分配?我应该使用智能指针将它们改回指针吗?

最佳答案

它几乎肯定不在堆上,因为它不是用 new 创建的。

但是,该标准对 static 变量的放置位置保持沉默,仅提及它们的行为。例如,C++11 3.7.1:

1/ All variables which do not have dynamic storage duration, do not have thread storage duration, and are not local have static storage duration. The storage for these entities shall last for the duration of the program (3.6.2, 3.6.3).

2/ If a variable with static storage duration has initialization or a destructor with side effects, it shall not be eliminated even if it appears to be unused, except that a class object or its copy/move may be eliminated as specified in 12.8.

3/ The keyword static can be used to declare a local variable with static storage duration.

4/ The keyword static applied to a class data member in a class definition gives the data member static storage duration.

这几乎就是标准本身强加给他们的范围。

大多数实现可能会有一个与堆和堆栈分开的区域,用于存储静态存储持续时间的变量。

几乎可以肯定不是使用静态变量和引用导致代码变慢。在深入研究了编译器及其工作方式后,静态变量往往至少与其他变量一样快,因为它们可以非常快速地在内存中定位。


顺便说一句,您的单例指针变体有两个问题。如果您在线程环境中工作,第一个是潜在的竞争条件。如果不同的线程调用 Instance(),则可能会创建多个对象。

具体来说,如果线程A进入if语句,那么线程B开始运行,B可以通过,创建一个对象然后返回。如果 A 然后继续,它将创建一个 对象。

如果您是单线程的,或者您仅从一个线程创建实例,或者您在其他线程运行之前创建实例,您应该没问题。

第二期只是养眼。不需要从 if block 中返回对象,因为它会在您到达函数底部时返回:

static MapReader* Instance() {
if (instance == 0)
instance = new MapReader();
return instance;
}

关于c++ - 引用单例是在栈上还是在堆上?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25926407/

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