隐式内部链接与显式内部链接("static")不同?

Implicit internal linkage not the same as explicit internal linkage ("static")?

本文关键字:内部 链接 不同 static      更新时间:2023-10-16

今天我遇到了一个特殊性,虽然可能不是很重要,但却让我感到困惑。也许我只是对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((,我也尝试了一个匿名命名空间,得到了相同的结果。

查看汇编程序源代码可以发现,显式内部链接(staticnamespace{}(会将字符串文字移到.rdata而不是.data中,并且字符串文字与指针到字符串文字数组交错,而不是将所有字符串和所有指针分别放在一个块中。这可能也是不同大小的原因——很可能将数据从一个部分混洗到另一个部分已经达到了部分大小的限制。有趣的是,这三种口味的名字也不一样。

现在我想知道:我是不是在说一个谬论,那些而不是的指针是否应该有内部联系?

此外,在我的理解中,const已经是只读的,那么static const"更只读"(一个进入.rdata,另一个不进入(?

您的数组不是声明的const,因此它们也不是隐式的内部链接。您所拥有的是指向const的指针的非const数组。

也就是说,我不知道为什么这会影响字符串最终是在.rdata还是.data中。