2011-06-30 56 views
8

今天我遇到了一个虽然可能不是很重要,但让我困惑的事物。也许我只是不正确地理解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,并且字符串文字是交错的,而不是具有所有与指针到字串文本阵列,字符串和一个块中的所有指针。这里可能是不同大小的原因 - 很可能将数据从一个部分移动到另一个部分已经达到了部分大小限制。有趣的是,所有3种口味也都不同。

现在我想知道:我是否犯了一个谬论,应该是那些指针不是有内部联动吗?

此外,在我的理解const已经是只读的,inhowfar是static const“更多只读”(一个进入.rdata和其他没有)?

回答

7

您的数组是而不是宣布为const,因此它们也不是隐式内部连接。你有什么是指向const的非const数组。

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

+0

哦,我的,当然......我的一个愚蠢的,明显的错误。实际上,它应该是'const char * const a []',它的行为也如预期一样(隐式内部链接,并具有相同的变形)。如果数组不是const,那么为什么非常量指针将会在'.data'中。只是文字,我不知道......我希望这些在任何情况下都是只读的。仍然,优秀的捕获。 – Damon