假设我有图书馆(A)
实现单例模式(它的实现中有一个静态变量)。
(A)
库被编译为静态库。
现在,假设我的项目中有:
-
(B)
,另一个静态链接的静态库(A)
.
-
(C)
,另一个静态链接的静态库(A)
.
-
(D)
,一个顶级程序链接(B)
and (C)
.
最后,我的单例真的是单例(并且我的变量真的是静态的)吗?是(B)
and (C)
看到相同的静态变量(A)
(是唯一的吗)?或者事实是否如此(A)
被静态链接两次嵌入(A)
的代码两次以我的静态变量结束(A)
在最终的二进制代码中出现两次?那么如果(B)
修改静态变量值,(C)
不会看到变化吗?
注意:我在将项目库更改为静态链接而不是动态链接时经历过。我只是想知道我是否做错了什么,或者这是否是正常的已知行为。
首先:
(B) 和 (C) 不链接到 (A)。静态库是编译的,而不是链接的。
构建 (B) 和 (C) 时,编译器可能需要查看 (A) 中的某些定义,但不要将其与链接混淆。 (A) 代码不会复制到 (B) 或 (C) 中。
第二:
(D) 必须链接到(A)、(B) 和(C)。这意味着您在 (D) 中只能获得 (A) 代码的一份副本。
动态链接库/共享对象:
如果 (B) 和 (C) 是 dll/sos,这当然会有所不同。 Dll 是链接的,因此如果您将 (B) 和 (C) 构建为 dll 并将它们链接到 (A),那么您将在 (B) 和 (C) 中拥有 (A) 代码的单独副本。
(B) 和 (C) 是否从 (A) 中看到相同的静态变量
这取决于你的变量是否有外部或内部链接 http://en.cppreference.com/w/cpp/language/storage_duration。以下头文件包含具有内部链接的静态 int 变量。这意味着包含此文件的每个翻译单元都将获得其自己的副本myVariable
.
//MyHeader.h
#pragma once
static int myVariable = 0;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)