隐式内部联系与显式内部联系("静态")不同?

Dam*_*mon 9 c++ static gcc const linkage

今天我遇到了一种古怪的东西,虽然可能不是很重要,但仍困扰着我.也许我只是没有正确理解C++.

源文件中的某些数组指向字符串文字,如下所示:

const char* a[] = { "a", "b", "c" };
const char* b[] = { "d", "e"};
const char* c[] = { "f", "g"};
Run Code Online (Sandbox Code Playgroud)

除了传递给GetProcAddress从库中检索函数指针(这是一个非阻塞的动态OpenAL/EFX /捕获函数加载器和上下文创建者/管理器)之外,这些指针数组都不会以任何方式使用.

最终我发现我应该声明这些变量,static const因为它们在.cpp文件之外的任何地方都不需要,所以使内部链接显式是合适的.无论如何,它们应该有内部联系(ISO14882 3.5(3)),所以我们只是通过明确编译器已经假定的内容来成为好公民.

进行无辜的更改导致可执行文件大小增加512字节.不像额外的512b真的很重要,但它似乎没有意义,完全相同的事情会导致不同的代码.由于static const不推荐使用(ISO14882 7.3.1.1(2)),我也尝试了一个匿名命名空间,结果相同.

查看汇编程序源显示显式内部链接(staticnamespace{})将字符串文字移动到.rdata而不是.data,并且字符串文字与指向字符串文字数组交错,而不是在一个块中包含所有字符串和所有指针,分别.这里可能存在不同大小的原因 - 很可能将数据从一个部分改组到另一个部分已经达到了部分大小约束.有趣的是,所有3种口味的名称也不同.

现在我想知道:如果那些指针没有内部联系,我是否会犯谬误?

另外,在我的理解const中已经是只读的,inhowfar是static const"更多只读"(一个进入.rdata而另一个没有)?

Ste*_*sop 7

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

也就是说,我不知道为什么这会影响字符串是否结束.rdata.data.