gpt4 book ai didi

c++ - 模板类静态在最终二进制文件中是否在共享库中以不同方式实例化?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:00:00 26 4
gpt4 key购买 nike

我有几个类充当唯一类型 ID 生成器:

// <type_generator.hpp>
template<typename SK,typename T>
struct Component
{
static uint const index;
};

template<typename SK>
class ComponentCount
{
template<typename CSK,typename CT>
friend struct Component;

private:
template<typename T>
static uint next() {
return ComponentCount<SK>::get_counter();
}

static uint get_counter()
{
static uint counter = 0;
return counter++;
}
};

template<typename SK,typename T>
uint const Component<SK,T>::index(ComponentCount<SK>::template next<T>());

struct Key{};

现在假设我在多个不同的库中以不同的方式实例化上述类模板:

// libsrc0
uint const x0 = Component<Key,int>::index;
uint const x1 = Component<Key,std::string>::index;
uint const x2 = Component<Key,double>::index;

// libsrc1
uint const x0 = Component<Key,std::string>::index;
uint const x1 = Component<Key,double>::index;
uint const x2 = Component<Key,int>::index;

// libsrc2
uint const x0 = Component<Key,int>::index;
uint const x1 = Component<Key,std::string>::index;

是否可以保证链接到 libsrc0、libsrc1 和 libsrc2 的二进制文件将具有一致的 Component::index 索引定义,并且每个索引设置为不同的值?

Component<Key,int>::index
Component<Key,std::string>::index
Component<Key,double>::index

最佳答案

Is there any guarantee that a binary that links against libsrc0, libsrc1 and libsrc2 will have a consistent definition of the Component::index indices?

是的。静态数据成员总是有 external linkage ,意思是同一个名字在所有的翻译单元中指的是同一个对象。类模板的静态数据成员也不异常(exception)。毕竟,类模板实例的行为与所有其他类一样。

即使每个共享库文件都有它自己的 Component 模板实例,尤其是 Component::index 变量,加载这些文件时只会选择和初始化一个实例图书馆。例如,我发现 Linux 下的 GNU 加载程序在编译可执行文件时总是从命令行中使用 -l 选项指定的第一个库中选择一个对象,而在其他程序中遇到的所有其他同名对象图书馆被简单地忽略了。

关于c++ - 模板类静态在最终二进制文件中是否在共享库中以不同方式实例化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43431003/

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