隐式内部链接与显式内部链接("static")不同?
Implicit internal linkage not the same as explicit internal linkage ("static")?
今天我遇到了一个特殊性,虽然可能不是很重要,但却让我感到困惑。也许我只是对C++的理解也不正确。
源文件中的一些数组指向字符串文字,如
const char* a[] = { "a", "b", "c" };
const char* b[] = { "d", "e"};
const char* c[] = { "f", "g"};
除了传递给GetProcAddress
以从库中检索函数指针之外,这些指针数组都没有以任何方式使用过(这是一个非阻塞的动态OpenAL/EFX/捕获函数加载器和上下文创建者/管理器(。
我最终想到,我可能应该将这些变量声明为static const
,因为在.cpp文件之外的任何地方都不需要它们,所以显式地进行内部链接似乎是合适的。无论如何,它们应该有内部链接(ISO14882 3.5(3((,所以我们只是通过明确编译器已经假设的内容来成为好公民。
做那个无辜的更改导致可执行文件的大小增加了512字节。额外的512b并不重要,但完全相同的东西会导致不同的代码,这似乎没有意义。由于static const
已被弃用(ISO14882 7.3.1.1(2((,我也尝试了一个匿名命名空间,得到了相同的结果。
查看汇编程序源代码可以发现,显式内部链接(static
或namespace{}
(会将字符串文字移到.rdata
而不是.data
中,并且字符串文字与指针到字符串文字数组交错,而不是将所有字符串和所有指针分别放在一个块中。这可能也是不同大小的原因——很可能将数据从一个部分混洗到另一个部分已经达到了部分大小的限制。有趣的是,这三种口味的名字也不一样。
现在我想知道:我是不是在说一个谬论,那些而不是的指针是否应该有内部联系?
此外,在我的理解中,const
已经是只读的,那么static const
"更只读"(一个进入.rdata
,另一个不进入(?
您的数组不是声明的const
,因此它们也不是隐式的内部链接。您所拥有的是指向const的指针的非const数组。
也就是说,我不知道为什么这会影响字符串最终是在.rdata
还是.data
中。
- 内联函数中具有内部链接的全局变量
- C++:具有内部链接的正向声明常量
- 具有命名空间范围的名称的 C++ 内部链接
- 为什么函数 f4 的名称具有内部链接,而不是 C 语言链接?
- 为什么在匿名名称空间中定义的模板时,为什么内部链接错误
- C++构造函数具有内部链接,但未定义 [-Wundefined-internal]
- C 无需使用匿名名称空间即可实现内部链接
- 内联是否决定内部链接?
- ODR和内部链接
- 为什么内部链接的名称会出现在我的目标文件的符号表中?
- C 标准:DO命名空间constexpr变量具有内部链接
- 通过来自另一个翻译单元的指针调用具有内部链接的函数
- 如何使朋友函数具有内部链接
- 类使用全局外部常量变量,该变量通过内部链接定义
- char* 具有内部链接,因此它不能不是非类型模板参数
- C++中const的内部链接,但我得到了重复的符号
- 非成员函数模板何时具有内部链接
- 我是否应该始终将我的全局函数与内部链接
- 内联命名空间变量有内部链接吗?如果没有,为什么下面的代码有效
- 使用comsup.lib时出现内部链接器错误