gpt4 book ai didi

共享库中的 c++ 静态变量和更好的可见性

转载 作者:太空宇宙 更新时间:2023-11-04 12:47:16 26 4
gpt4 key购买 nike

有一个共享库A包含静态数据S,A与共享库B和共享库C共享链接。主进程会在运行时动态加载B.so和C.so。在测试期间,看起来像数据S在 B 和 C 之间共享。但我不知道为什么。

我的第一个问题是:我了解到共享库代码是共享的(内存中只有一份文本),这是否意味着如果多个库使用它,共享库中的数据应该被复制?比如静态数据S。

第二个问题是:目前我将数据 S 声明为

struct S {
static S1 s1;
static S2 s2;
...
}

在A.h 文件中并在A.cpp 文件中定义它们。对于阅读这段代码的人来说,这些静态数据是共享的,而不是不同的编译单元会有自己的拷贝,这可能并不明显。有什么好的方法可以让它更明显吗?

谢谢!

最佳答案

首先,请注意在 Windows 上通常情况下动态库不共享变量,仅共享函数。但是 Unix 模型是任何链接都具有相同的语义:加载每个模块的所有依赖项,但不会包含在它们的客户端中,因为这可能会导致重复。

这通常被认为是一项功能:如果您的库具有全局状态(例如,以保护配置文件等共享资源),那么在所有情况下(每个进程)都只有一个是很好的.至于“显而易见”,您通常应该假设您的客户知道这一点(在某种程度上他们需要了解您的库中的全局变量)。

当然,一个更好的主意是避免这种全局状态:而是让客户端维护它(当然,使用库提供的函数)。一些这样的共享状态自然地变成局部于附近的一些堆栈框架,扮演着类似于 Builder 模式的角色。其他的可以成为线程局部的(可能只是在线程的初始函数中是局部的)。

任何实际上需要在进程范围内运行的东西最终都变成了 main 中的局部,将其余代码转换为无状态、可组合的库。 (这样的变量在包含 main 的翻译单元中可以改为 static 而不是其他,但这只是限制了它们的初始化。)

关于共享库中的 c++ 静态变量和更好的可见性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50848547/

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