今天我遇到了一种古怪的东西,虽然可能不是很重要,但仍然困扰着我。也许我只是不正确理解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
,字符串文字是与指向字符串的文字数组交错,而不是分别在一个块中包含所有字符串和所有指针。这里可能存在不同大小的原因 - 很可能将数据从一个部分改组到另一个部分已经达到了部分大小约束。有趣的是,所有3种口味也都有不同的名称。
现在我想知道:如果那些指针不有内部联系,我是否会犯谬误?
此外,根据我的理解,const
已经是只读的,inhowfar是static const
“更多只读”(一个进入.rdata
而另一个没有进入?)
答案 0 :(得分:7)
您的数组不声明为const
,因此它们也不是隐式内部链接。你所拥有的是非const const指针到const的数组。
那就是说,我不知道为什么这会影响字符串是否以.rdata
或.data
结尾。