静态成员的两个实例,怎么可能?

2023-11-26

我有一个多线程应用程序。 我在共享库中声明一个具有静态成员的类。

从不同库的不同线程打印成员的地址会显示不同的结果。

//宣言

template <class OBJECT>
struct Container
{
   static int m_member;
};

template <class OBJECT>
int Container<OBJECT>::m_member;

// 印刷

cout << (void*) &Container<int>::m_member << endl;

怎么可能呢?


如果您有不同的库(我猜是不同的动态库),那么您可能会有一些重复的代码和静态变量。

确切的细节将取决于您正在使用的特定动态库技术。例如,我想说的是,在 Windows DLL 中,您将有重复的代码和变量,但在 Linux SO 中则不会。

无论如何,您应该提供有关操作系统和项目布局的更多详细信息。

UPDATE:啊,但是你的类是一个模板!共享库中的模板实例化是一个奇怪的野兽!为了确保在所有流程中只使用类的一份副本,您必须显式实例化模板并确保此实例化在 SO 中导出,并且从客户端代码中使用它。详细信息因编译器而异,但您可以检查如何std::string已完成,例如:

在头文件中:

namespace std
{
    extern template class basic_string<wchar_t>;
}

在库的源代码中:

namespace std
{
    template class basic_string<wchar_t>;
}

当然,您需要提前知道您的模板需要哪些实例化。显然,SO 无法导出使用它一无所知的类型的实例。

UPDATE:啊,但是你有两个不同的库实例化模板...那么如果两个库都将显式实例化定义为extern共享的 ELF 魔法应该将两个实例合并为一个。

另一个更新:使用模板和共享对象后,通常就可以正常工作了。我现在的猜测是你正在编译库-fvisibility=hidden或类似的。如果是这样的话,只需要写:

template <class OBJECT>
struct __attribute__((visibility("default"))) Container
{
   static int m_member;
};

使模板的特化进入动态符号表,从而避免重复。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

静态成员的两个实例,怎么可能? 的相关文章

随机推荐

  • 如何使用多部分/表单数据通过电报机器人发送照片

    我有一个电报机器人 用 python 开发 我想发送 上传照片通过它从我的计算机中的图像 所以我应该通过多部分表单数据来完成 但我不知道怎么做 我也没有在互联网和电报文档上找到有用的来源 我尝试通过下面的代码来做到这一点 但这是错误的 da
  • 了解 .NET 的“SecurityAction”权限参数

    谁能解释 SecurityAction 枚举值的含义和用途 MSDN 页面不是很清楚 它说 LinkDemand 发生在即时编译时 而 Demand 发生在运行时 为什么有这种区别 在什么情况下我会使用 LinkDemand 而不是 Dem
  • 为什么 ProcessPoolExecutor 和 Pool 会因 super() 调用而崩溃?

    1 为什么下面的Python代码使用concurrent futures模块永远挂起 import concurrent futures class A def f self print called class B A def f sel
  • Python Pandas 获取排除当前行的累积和(cumsum)

    我正在尝试获取给定列的累积计数 该列不包括数据框中的当前行 我的代码如下所示 仅使用 cumsum 的问题在于它在计数中包含当前行 我希望 df ExAnte Good Year Count 在 ExAnte 的基础上计算 cumsum 即
  • 将视频流式传输(或渐进式下载)到 Droid 浏览器

    我正在尝试将视频流式传输 或使用渐进式下载 到 Motorola Droid 浏览器 但运气不佳 使用 iPhone 我可以将 Safari 定向到http xxx xxx xxx 文件名 mp4 这是一个 MPEG 4 视频文件 Safa
  • 安卓apk无法安装?我在哪里可以检查此日志?没有给出理由

    我点击 apk 文件 它提示安装 但很快停止 没有指示它是否已安装或问题是什么 如何查看未安装的原因 此类信息的日志在哪里 您可以通过 USB 将您的设备连接到您的机器吗 您应该能够转到提示并执行以下操作 adb install
  • 如何用Matlab构造不等宽直方图?

    我想构造一个具有不等箱 间隔 的直方图 Matlab 仅构造具有相等箱的直方图 就好像它是一个图表一样 请帮助我 非常感谢 这是一个例子 x randn 100 1 3 some random data e 10 5 3 1 1 2 3 2
  • virtualenv蛋黄问题

    yolk l给我的信息是我的 Ubuntu 10 04 上安装了 114 个软件包 使用创建新的 virtualenv 目录后 virtualenv virt env virt1 no site packages clear 我切换到那个
  • Linq-to-Entities:选择查询表达式中的日期格式

    我试图直接从 LINQ to Entities 查询表达式获取格式化的日期字符串 nonBusinessDays from ac in db AdminCalendar where ac DateTimeValue gt calendarS
  • Android Toast 通知在冰淇淋三明治中太小 [重复]

    这个问题在这里已经有答案了 有人对冰淇淋三明治中的吐司通知太小有任何问题吗 在我的应用程序中 通知在所有其他版本上看起来都很好 然而 在冰淇淋三明治中 它的尺寸却小得令人难以置信 起初我以为这可能是我的自定义主题 但禁用它后 我看到了相同的
  • 将数据库保存在外部硬盘上

    我正在使用 PostgreSQL 创建一些数据库 但由于我的计算机内存不足 我想将它们保存在外部硬盘上 我怎样才能做到这一点 您可以将数据库存储在另一个磁盘上 方法是将其指定为data directory环境 您需要在启动时指定它 它将适用
  • 在设计 JS 库时,我应该使其兼容 RequireJS/AMD 还是不兼容?

    如果我正在制作一个通用的 JavaScript 库 我应该如何处理 RequireJS 支持 据我所知 让你的代码或多或少地兼容 RequireJS 会让你的代码在没有 RequireJS 的情况下无法使用 那我为什么要这么做呢 没有 Re
  • omu.valueinjecter 深度克隆与类型不同

    我认为我缺少一个关于 valueinjecter 和 或 AutoMapper 的简单概念 但是如何将父级 dto Entity 深度克隆到 biz Entity 并包含所有子级 例如 biz person InjectFrom dto p
  • 如何创建 NodeJS 模块?

    我已阅读 NodeJS 网站上的详细信息 https nodejs org api modules html 我不明白模块是如何工作的 创建模块的最少步骤是什么 以及 npm 如何帮助我 如何创建模块 我如何使用模块 把它放在 npm 上是
  • 如何在 UIDatePicker 中仅禁用日期选择而不是时间选择

    我在我的应用程序中使用 UIDatePicker 我想仅禁用其中的日期选择 并且时间选择不应受到影响 谁能帮我这个 Set the datePickerMode to UIDatePickerModeTime
  • 使用与密钥相同的字符串加密字符串是否安全?

    在 CBC 模式下使用 AES 并使用 IV 当然 对给定密钥本身进行加密是否存在任何安全缺点 遵循以下原则 密钥是秘密的 IV 是公开的 因为这不会影响加密的安全性 然而 潜在的攻击者将会知道 因为他可以访问源代码 该字符串使用其自身作为
  • 具有相机意图和图像选择器意图的选择器

    我创建了一个选择器 用于从文件中选择图像或制作图片 我使用的代码在 Nexus 5 上运行良好 但是当我在 Samsung S5 上尝试时 选择器不显示相机图标 public Intent makePhotoIntent String ti
  • docker 互联网连接 iptables=false

    我放弃 我在 ubuntu 16 04 下使用 Docker 1 12 0 并使用 UFW 进行强化 该机器有 2 个接口 一个公共 eth0 和一个专用网络 eth1 Server Version 1 12 3 Storage Drive
  • 如何仅使用 CSS 获得悬停效果

    我已经得到了圆圈部分 我在 div 上设置了黑色的背景颜色 对于文本 我设置了 a hover 作为显示的颜色 我只是不知道如何为 div 设置 a hover 以及仅针对该周长 这是我的代码 HTML a class cirlink hr
  • 静态成员的两个实例,怎么可能?

    我有一个多线程应用程序 我在共享库中声明一个具有静态成员的类 从不同库的不同线程打印成员的地址会显示不同的结果 宣言 template