共享库中的静态全局字段 - 它们在哪里?

时间:2009-10-16 17:36:16

标签: c++ static shared-libraries

我有一个cpp文件,我从中生成一个共享库(使用autofoo等)。在cpp文件中,我已经声明了一些我在整个库函数中使用的静态字段。

我的问题是两部分:

1)这些字段存储在内存中的哪个位置?它不像系统实例化整个库并将其保存在内存中......毕竟,库实际上只是一堆钩子。

2)有更好的方法吗?我之所以这样做的原因是我想避免要求用户将字段作为参数传递给每个库函数调用。

谢谢!

2 个答案:

答案 0 :(得分:3)

用于加载共享库的代码:
通常(每个都有轻微的技术差异):

  • 将共享库加载到内存
  • 使用符号表并更新DLL中的函数地址
  • 使用构造函数初始化任何全局静态成员。

注意:共享的lib加载程序不需要在加载点完成所有这些操作 它可能懒洋洋地完成其中一些工作(实现细节)。但它们将在使用前完成。

任何全局staic POD变量(没有构造函数的东西)。将根据天气的初始化或不存储而存储在特殊的内存段中(同样是实现细节)。如果它们已初始化,那么它们将使用已定义的值从磁盘(或共享lib源)加载。

所以问题的答案是:

  • 未定义。
    • 图书馆是代码段
    • 初始化数据段
    • 未初始化的数据段
    • 一些知道如何将其链接到正在运行的应用程序的实用程序代码。
  • 比完全更好
    • 良好做法建议将值传递给函数而不是依赖于全局状态。但说实话,这是一种过度概括,真正归结为问题。

答案 1 :(得分:1)

从逻辑上讲, 就像系统实例化整个库一样。在实践中,只有代码才真正在共享库中“共享”,任何链接它的人都将获得数据的副本。 (好吧也许不是只读数据)。所以,到目前为止你的问题是:

1)您的流程将以某种方式获取变量的副本(取决于您的操作系统上的共享库系统如何工作)。

2)我认为这种方法没有问题。