静态库中的单例类

2024-05-17

假设我在静态库中有一个单例类 S,它可以与其他动态库 D1 D2 D3 链接,

因此,据我了解,类 S 在每个 D1、D2 和 D3 中都会有一个单独的实例,即使它不是单例(如全局),这也是正确的

有什么办法可以防止S类的多副本吗? 我无法将单例 S 放入另一个动态库中。

                 Executable
                /   |   \   \
              D1    D2  D3  D4 
               |    |   |
               S    S   S

编辑: 单例 S 位于单独的静态库中,分别与 D1 D2 D3... 链接。
单例是在堆中分配的,只有指针是静态的

static s::instance()
{
    static smart_ptr<S> ptr = NULL;
    if(ptr == NULL) ptr = new S;
    return ptr;
}

Edit2:

我做了一个简单的测试用例来检查一下 这是我为了检查而制作的示例 makefile(用 .so 替换 .dll),我在 Ubuntu 和 Cygwin 上检查了它,这两个 g++ 编译器的行为是不同的。 cygwin 创建了 2 个不同的对象,但 ubuntu 创建了 1 个对象

all: dynamic1 dynamic2 main

static: static.cpp 
    g++ -c -fPIC static.cpp -o obj/static.o
    ar rvs lib/static.a obj/static.o 

dynamic1: static dynamic1.cpp
    g++ -fPIC -shared dynamic1.cpp lib/static.a -o lib/libdynamic1.dll

dynamic2: static dynamic2.cpp
    g++ -fPIC -shared dynamic2.cpp lib/static.a -o lib/libdynamic2.dll

main: dynamic1 dynamic2 main.cpp
    g++ --std=c++11 main.cpp -ldynamic1 -ldynamic2 -o lib/main -L./lib

如果您的动态链接器没有损坏,那么您应该不会有任何问题。即使每个动态库实际上都包含来自静态库 S 的目标文件,动态加载器也应该足够聪明,能够确定它们对应于相同的符号,并在整个应用程序中一致地使用相同的地址。

In short, if your system is not broken has a true dynamic loader, there is no problem here


根据您的编辑,我确认上面的内容是在一个美好的世界中应该有的方式,也是在类 Unix 系统中的方式。你说它在 Ubuntu 上工作,我可以确认在 FreeBSD 上也同样工作。

但不幸的是,在 Windows 上情况有所不同。你没有像这样的真正的动态加载器ld.so但您只需要 DLL 中导出函数或数据的地址。因此,每个 DLL 将使用自己的单例副本,因为每个 DLL 将包含自己的代码副本并使用它,因为没有全局链接阶段来合并它。

更糟糕的是,我无法想象任何简单的解决方法:静态链接和动态链接具有不同的行为句号。这意味着,只要您在 Windows 上使用动态链接,单例或可从至少两个不同 DLL 访问的任何共享数据都必须驻留在一个位置,即 DLL。

TL/DR:如果你的系统有一个真正的动态加载器(Unix之类的有),你不必担心静态或动态链接,加载器(ld.so)会关心它。在 Windows 上,它没有动态加载程序,但有一个运行时LoadLibraryAPI调用时,任何共享数据必须驻留在一个且仅一个模块中。

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

静态库中的单例类 的相关文章

  • 以文化中立的方式将字符串拆分为单词

    我提出了下面的方法 旨在将可变长度的文本拆分为单词数组 以进行进一步的全文索引处理 删除停止词 然后进行词干分析 结果似乎不错 但我想听听关于这种实现对于不同语言的文本的可靠性的意见 您会建议使用正则表达式来代替吗 请注意 我选择不使用 S
  • 为什么 C# Array.BinarySearch 这么快?

    我已经实施了一个很简单用于在整数数组中查找整数的 C 中的 binarySearch 实现 二分查找 static int binarySearch int arr int i int low 0 high arr Length 1 mid
  • Web 客户端和 Expect100Continue

    使用 WebClient C NET 时设置 Expect100Continue 的最佳方法是什么 我有下面的代码 我仍然在标题中看到 100 continue 愚蠢的 apache 仍然抱怨 505 错误 string url http
  • 在哪里可以找到列出 SSE 内在函数操作的官方参考资料?

    是否有官方参考列出了 GCC 的 SSE 内部函数的操作 即 头文件中的函数 除了 Intel 的 vol 2 PDF 手册外 还有一个在线内在指南 https www intel com content www us en docs in
  • Asp.NET WebApi 中类似文件名称的路由

    是否可以在 ASP NET Web API 路由配置中添加一条路由 以允许处理看起来有点像文件名的 URL 我尝试添加以下条目WebApiConfig Register 但这不起作用 使用 URIapi foo 0de7ebfa 3a55
  • 为什么当实例化新的游戏对象时,它没有向它们添加标签? [复制]

    这个问题在这里已经有答案了 using System Collections using System Collections Generic using UnityEngine public class Test MonoBehaviou
  • 不同枚举类型的范围和可转换性

    在什么条件下可以从一种枚举类型转换为另一种枚举类型 让我们考虑以下代码 include
  • C#中如何移动PictureBox?

    我已经使用此代码来移动图片框pictureBox MouseMove event pictureBox Location new System Drawing Point e Location 但是当我尝试执行时 图片框闪烁并且无法识别确切
  • C++ OpenSSL 导出私钥

    到目前为止 我成功地使用了 SSL 但遇到了令人困惑的障碍 我生成了 RSA 密钥对 之前使用 PEM write bio RSAPrivateKey 来导出它们 然而 手册页声称该格式已经过时 实际上它看起来与通常的 PEM 格式不同 相
  • 我应该避免在 golang 中使用单例包吗?

    现在我有一个包裹store包含以下内容 package store var db Database func Open url string error open db connection func FindAll model inter
  • 使用 Bearer Token 访问 IdentityServer4 上受保护的 API

    我试图寻找此问题的解决方案 但尚未找到正确的搜索文本 我的问题是 如何配置我的 IdentityServer 以便它也可以接受 授权带有 BearerTokens 的 Api 请求 我已经配置并运行了 IdentityServer4 我还在
  • 转发声明和包含

    在使用库时 无论是我自己的还是外部的 都有很多带有前向声明的类 根据情况 相同的类也包含在内 当我使用某个类时 我需要知道该类使用的某些对象是前向声明的还是 include d 原因是我想知道是否应该包含两个标题还是只包含一个标题 现在我知
  • 如何在 C 中调用采用匿名结构的函数?

    如何在 C 中调用采用匿名结构的函数 比如这个函数 void func struct int x p printf i n p x 当提供原型的函数声明在范围内时 调用该函数的参数必须具有与原型中声明的类型兼容的类型 其中 兼容 具有标准定
  • 如何序列化/反序列化自定义数据集

    我有一个 winforms 应用程序 它使用强类型的自定义数据集来保存数据进行处理 它由数据库中的数据填充 我有一个用户控件 它接受任何自定义数据集并在数据网格中显示内容 这用于测试和调试 为了使控件可重用 我将自定义数据集视为普通的 Sy
  • 使用 x509 证书签署 json 文档或字符串

    如何使用 x509 证书签署 json 文档或字符串 public static void fund string filePath C Users VIKAS Desktop Data xml Read the file XmlDocum
  • 覆盖子类中的字段或属性

    我有一个抽象基类 我想声明一个字段或属性 该字段或属性在从该父类继承的每个类中具有不同的值 我想在基类中定义它 以便我可以在基类方法中引用它 例如覆盖 ToString 来表示 此对象的类型为 property field 我有三种方法可以
  • 链接器错误:已定义

    我尝试在 Microsoft Visual Studio 2012 中编译我的 Visual C 项目 使用 MFC 但出现以下错误 error LNK2005 void cdecl operator new unsigned int 2
  • 如何使用 C# / .Net 将文件列表从 AWS S3 下载到我的设备?

    我希望下载存储在 S3 中的多个图像 但目前如果我只能下载一个就足够了 我有对象路径的信息 当我运行以下代码时 出现此错误 遇到错误 消息 读取对象时 访问被拒绝 我首先做一个亚马逊S3客户端基于我的密钥和访问配置的对象连接到服务器 然后创
  • 将控制台重定向到 .NET 程序中的字符串

    如何重定向写入控制台的任何内容以写入字符串 对于您自己的流程 Console SetOut http msdn microsoft com en us library system console setout aspx并将其重定向到构建在
  • C# - OutOfMemoryException 在 JSON 文件上保存列表

    我正在尝试保存压力图的流数据 基本上我有一个压力矩阵定义为 double pressureMatrix new double e Data GetLength 0 e Data GetLength 1 基本上 我得到了其中之一pressur

随机推荐

  • 错误 build.gradle 与 com.google.android.gms:play-services-maps:9.4.0

    在我的应用程序中 我有这些依赖项 apply plugin com android application android compileSdkVersion 23 buildToolsVersion 23 0 2 defaultConfi
  • 需要可见元素的 xpath 定位器

    我正在尝试对我的网站进行测试 在某些用户表单上遇到问题 诀窍是 表单中文本字段的数量根据用户选项的不同而变化 代码中存在禁用的文本字段 但样式为 displayed none gt 标签 所以我试图找到比逐一定位每个元素并用 try exc
  • 属性文件中的特殊字符

    在我的 Java Spring Web 应用程序中 我在打印从属性文件检索的意大利语特殊字符 等 时遇到问题 我找到了这篇文章http docs oracle com cd E26180 01 Platform 94 ATGProgGuid
  • 重命名多索引列名称Python

    我有一个如下所示的 MultiIndex Dataframe df Office Office x True 2 y False 3 z True 5 如果我重置 df reset index 它将错误为 cannot insert Off
  • 从 JSON 文件注入的编译指令 AngularJS

    希望有人能帮助我应对这一挑战 我使用以下命令从服务器请求 JSON 数据 http get 来自服务器的数据返回一个对象 对象中的一个值包含 HTML 标记 该标记使用以下方式注入到页面中 div div 在标记内 有一个名为的自定义指令
  • lambda 表达式的“类型”可以表达吗?

    将 lambda 表达式视为可调用对象的 语法糖 是否可以表达未命名的基础类型 一个例子 struct gt bool operator int l int r return l gt r Now int l int r return l
  • 使用 Mockito 模拟文件、FileReader 和 BufferedReader 类

    我在我想测试的方法中得到了下面的代码 File f map get key1 BuffereReader r new BufferedReader new FileReader f String line null do line r re
  • 如何确定 R 包的作者?

    如何确定包的作者是谁 鉴于我们拥有这个广泛使用的代码库 我认为参考我在分析中使用的软件是合适的 有没有办法以编程方式检索作者和任何其他相关信息 在伪代码中 我想执行以下操作 references base 我怎样才能做到这一点 为了能够引用
  • 在 Blazor 中读取和显示嵌套类/表中的数据的最佳方法是什么?

    主要目标 我正在创建一个 Blazor 应用程序 它将一次显示报告的一个段落 用户需要单击某个按钮才能转到报告的下一段 我需要创建一个数据库 其中包含段落 节标题和文档的表格 我的问题 我的问题与数据库部分以及如何从数据库读取数据的方式有关
  • sendResponse 不等待异步函数或 Promise 的解析[重复]

    这个问题在这里已经有答案了 我遇到了异步问题 我相信 sendResponse in 内容脚本 js不等待getThumbnails 回来 我正在发送一个message in popup js chrome tabs sendMessage
  • 压缩 zend Framework 2 的 html 输出

    我目前正在 PHP 5 4 4 上使用 Zend Framework 2 beta 开发个人 web 应用程序以用于自学目的 我想知道是否可以在 html 输出发送到浏览器之前拦截它 以便通过删除所有不必要的空格来缩小它 我怎样才能在ZF2
  • PostgreSQL 在递归查询中找到所有可能的组合(排列)

    输入是一个长度为 n 的数组 我需要生成数组元素的所有可能组合 包括输入数组中元素较少的所有组合 IN j A B C OUT k A AB AC ABC ACB B BA BC BAC BCA 随着重复 所以AB BA 我尝试过这样的事情
  • C# Mongo DeleteMany - 不使用类

    我在 MongoDB 中有一个普通的 不是 GridFS 集合 我需要访问和删除一些文档 我想 需要在不使用类的情况下执行此操作 昨天 今天尝试了一些事情 并在网上进行了很多搜索并尝试了很多事情 无法弄清楚为什么 deletemany 对我
  • 从 FilterControllerEvent 监听器重定向到另一个 Symfony 路由

    我正在尝试设置一个 kernel controller 侦听器 以便在函数返回 true 时重定向到另一个路由 我有可用的路线 但无法使用此路线设置控制器 event gt setController 我收到以下错误 FilterContr
  • Javafx 从 TextField 获取输入

    这是我当前的代码 它所做的只是为我制作的计算器设置一个 GUI 界面 我希望用户输入两个值 然后当按下 Sum 按钮时 它将两个值加在一起并将其显示在 Sum 文本字段中 我正在尝试使用 JavaFX 如果您能提供一些帮助 我将不胜感激 i
  • 如何获得 calc() 函数的无单位结果

    我正在使用此计算来获取网页中的流体行高 line height calc 1 42em 1 55 1 42 100vw 300px 1080 300 数学是工作属性 除非我改变font size特定部分 因为line height应使用无单
  • 为什么我们在 C 中使用 \r 和 \b ?

    我们为什么使用 r and b在C语言中 我知道 b使 hello world 变成 hellworld 但我们可以只写 hellworld 而不是 hello world 那么 它在程序中的作用是什么 This https stackov
  • 为什么 Xcode 不给文件名添加前缀?

    当我启动 iOS 单视图应用程序项目时 AppDelegate 文件和 ViewController 文件不再像以前那样以项目名称为前缀 当我打开一个新项目时 文件名如下 AppDelegate hAppDelegate m MainSto
  • 如何将属性(例如枚举)绑定到不同类型的组件属性(例如每个枚举的图像)?

    我继承了一个使用 JGoodies Binding 将域模型连接到 GUI 的项目 然而 我发现一些不一致的地方也会导致一些错误 在这个具体例子中 GUI 由两个单选按钮和一个标签表示 根据选择的按钮 标签应显示特定的图像 这些按钮绑定到不
  • 静态库中的单例类

    假设我在静态库中有一个单例类 S 它可以与其他动态库 D1 D2 D3 链接 因此 据我了解 类 S 在每个 D1 D2 和 D3 中都会有一个单独的实例 即使它不是单例 如全局 这也是正确的 有什么办法可以防止S类的多副本吗 我无法将单例