【问题标题】:Can constant objects with static storage duration and equal, constant initializers be coalesced?可以合并具有静态存储持续时间和相等的常量初始化器的常量对象吗?
【发布时间】:2013-02-08 05:13:27
【问题描述】:

考虑两个具有静态存储持续时间和相等的常量初始化器的对象:

static const int a = 50;
static const int b = 50;

编译器将这些组合成&a == &b 是否有效?

(对于上下文,我正在考虑使用静态常量对象来获取唯一地址以用作标记指针值。如果编译器组合这些对象是合法的,并且我对两个这样的对象使用相同的常量值,那么地址可能相等,我不能将它们用作标记值。)

【问题讨论】:

  • 嗯...字符串可以被池化。所以如果我不得不猜测,这实际上可能是允许的。
  • 本质上,您的问题是具有静态存储持续时间的对象保证具有唯一地址。答案是,该标准不强制要求任何此类保证。
  • 相关(虽然不同,由于缺少static):Are const variables required to be distinct in memory?

标签: c c99 language-lawyer sentinel


【解决方案1】:

指针必须比较不相等。见 C99 6.5.9 第 6 段:

两个指针比较相等当且仅当两个指针都是空指针,都是指向同一个对象(包括一个指向一个对象和一个在其开头的子对象)或函数的指针,两者都是指向最后一个元素的指针相同的数组对象,或者一个是指向一个数组对象末尾的指针,另一个是指向另一个数组对象的开头的指针,该数组对象恰好紧跟在地址空间中的第一个数组对象之后。

【讨论】:

    【解决方案2】:

    不,标准禁止这样做。不同的对象必须有不同的地址。在const char a[]="abc", b[]="abc";中,ab被分配在不同的地址。如果它们是指针也是如此:const char *a="abc", *b="abc",aandb` 也分配在不同的地址;它们指向的字符串常量可以是单个常量数组,就好像它是一个命名对象一样。

    【讨论】:

    • 你能指出标准中说明这一点的部分吗?
    • 严格来说唯一能保证的是相等性测试的结果;该测试也是程序可以观察两个对象是否相同的唯一方法。这绝非偶然,它源于 C 中定义对象概念的方式。
    • @icktoofay 6.5.9.8p6,我自己不认识,但通过谷歌搜索发现“必须不同的对象具有不同的地址 C”,最热门的是 stackoverflow.com/a/6237094/1290731
    • 谢谢。您链接到的答案非常有趣。
    猜你喜欢
    • 2020-02-17
    • 1970-01-01
    • 2019-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-06
    • 2021-08-20
    相关资源
    最近更新 更多