【问题标题】:Implicit internal linkage not the same as explicit internal linkage ("static")?隐式内部链接与显式内部链接(“静态”)不同?
【发布时间】:2011-06-30 14:14:39
【问题描述】:

今天我遇到了一个特殊性,虽然可能不是很重要,但让我感到困惑。也许我也只是没有正确理解 C++。

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

const char* a[] = { "a", "b", "c" };
const char* b[] = { "d", "e"};
const char* c[] = { "f", "g"};

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

我最终想到,我可能应该将这些变量声明为 static const,因为在 .cpp 文件之外的任何地方都不需要它们,因此明确内部链接似乎是合适的。它们无论如何都应该有内部链接(ISO14882 3.5(3)),所以我们只是通过明确编译器已经假设的内容来成为好公民。

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

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

现在我想知道:我是否犯了一个谬误,那些指针 not 应该有内部链接吗?

另外,据我了解,const 已经是只读的,static const“更多只读”(一个进入 .rdata 而另一个没有)?

【问题讨论】:

    标签: c++ gcc static constants linkage


    【解决方案1】:

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

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

    【讨论】:

    • 哦,天哪,当然……多么愚蠢,我犯了一个明显的错误。实际上,它应该是const char* const a[],它的行为也符合预期(隐式内部链接,并且具有相同的修饰)。如果数组不是 const,为什么非常量指向文字的指针会在 .data 中也是有道理的。只是文字,我不知道......我希望这些在任何情况下都是只读的。不过,很好的收获。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-15
    • 1970-01-01
    • 2015-01-02
    • 2016-07-10
    • 1970-01-01
    相关资源
    最近更新 更多