gpt4 book ai didi

c++ - 单例翻译单元混淆

转载 作者:太空狗 更新时间:2023-10-29 21:11:27 25 4
gpt4 key购买 nike

ContainerTest.h 中,我定义了以下单例类:

    class ContainerTest
{
private:
ContainerTest()
{
test = InitializeTest();
}

ContainerTest(const ContainerTest&) = delete;
ContainerTest(ContainerTest&&) = delete;
ContainerTest& operator=(const ContainerTest&) = delete;
ContainerTest& operator=(ContainerTest&&) = delete;
public:
std::vector<uint32_t> test;

static ContainerTest& GetInstance()
{
static ContainerTest rhc;
return rhc;
}
};

我对整个程序中是否只存在一个 ContainerTest 实例感到困惑。

即,如果两个 cpp 文件 A.cppB.cpp 都包含 ContainerTest.h 是否会创建一个 ContainerTest 实例,还是两个实例?有人可以解释一下吗?如果创建了两个实例(一个用于 A 和 B 的翻译单元),我该如何防止这种情况发生?

最佳答案

函数中的 static 变量将获得一个唯一的符号名称,链接器使用该符号名称来确保只有一个实例。它会生成一个所谓的弱符号,它可能出现在多个翻译单元中。然后链接器将只使用一个实例。当嵌入到动态库/共享对象中时,这甚至会起作用。

我使用了以下小测试程序:(主要是您的代码)

#include <vector>
#include <cstdint>



class ContainerTest
{
private:
ContainerTest()
{ }

ContainerTest(const ContainerTest&) = delete;
ContainerTest(ContainerTest&&) = delete;
ContainerTest& operator=(const ContainerTest&) = delete;
ContainerTest& operator=(ContainerTest&&) = delete;
public:
std::vector<uint32_t> test;

static ContainerTest& GetInstance()
{
static ContainerTest rhc;
return rhc;
}
};


int main(int, char**)
{
ContainerTest& ct = ContainerTest::GetInstance();
}

然后用 gcc 编译然后我调用:

nm -a libContainerTestSingleton.so |grep rhc| c++filt

它提供了以下输出:

0000000000000000 b .bss._ZGVZN13ContainerTest11GetInstanceEvE3rhc
0000000000000000 b .bss._ZZN13ContainerTest11GetInstanceEvE3rhc
0000000000000000 u guard variable for ContainerTest::GetInstance()::rhc
0000000000000000 u ContainerTest::GetInstance()::rhc

一个符号,比标有 u 的意思如下:(nm 联机帮助页)

"u" The symbol is a unique global symbol.  This is a GNU extension to the
standard set of ELF symbol bindings. For such a symbol the dynamic
linker will make sure that in the entire process there is just one
symbolwith this name and type in use.

关于c++ - 单例翻译单元混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50609921/

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