今天我遇到了一个特殊性,虽然可能不是很重要,但让我感到困惑。也许我也只是没有正确理解 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
or namespace{}
) 会将字符串文字移动到.rdata
而不是.data
,并且字符串文字与指针到字符串文字数组交错,而不是将所有字符串和所有指针放在一个块中,分别。这也可能是大小不同的原因——很可能将数据从一个部分改组到另一个部分已经达到了部分大小限制。有趣的是,所有 3 种口味的名称也不同。
现在我想知道:我是否犯了一个谬误,这些指针是否应该没有内部链接?
另外,在我的理解const
中已经是只读的,static const
“更多只读”(一个进入.rdata
而另一个没有)?