2009-10-16 113 views
1

我有一个cpp文件,我从中生成共享库(使用autofoo等)。在cpp文件中,我已经声明了在整个库函数中使用的几个静态字段。共享库中的静态全局字段 - 他们去哪里?

我的问题是两部分:

1)凡有这些字段存储在内存中?这并不像系统实例化整个库并将其保存在内存中一样,该库毕竟只是一堆钩子。

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

谢谢!

回答

3

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

  • 加载共享库到存储器
  • 漫游符号表,并在更新的功能的地址DLL
  • 使用它们的构造函数初始化任何全局静态成员。

注意:共享lib加载器不需要在加载点完成所有这些操作。
它可能会做一些这些工作懒惰(实施细节)。但他们将在使用前完成。

任何全局staic POD变量(没有构造函数的东西)。将被存储在特殊的内存段中,具体取决于它们被初始化的天气(也是一个实现细节)。如果它们已被初始化,那么它们将用已定义的值从磁盘(或共享库源)加载。

所以回答你的问题:

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

从逻辑上讲,它是如果系统实例整个库作为。实际上,只有代码才能在共享库中“共享”,任何与它链接的人都将获得数据的副本。 (也许不是只读数据)。因此,到目前为止,您的问题仍然存在:

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

2)我没有看到这种方法的问题。