小智 6
据我所知,标准不允许任何类型的两个命名对象具有相同的地址(联盟成员除外).从6.5.9/6:
两个指针比较相等,当且仅当两个都是空指针时,两个指针都是指向同一个对象的指针...
字符串文字不是const变量,所以你的第二个问题没有实际意义,我不知道32位和字节序有什么关系.
在标准中,相等性在§6.5.9"等式运算符" &中讨论,在第6.5.3.2节"地址和间接运算符" const中讨论,并在§6.7.3"类型限定符"中讨论.关于指针平等的相关段落是§6.5.9.6:
两个指针比较相等,当且仅当两个都是空指针时,两者都是指向同一对象的指针(包括指向对象的指针和开头的子对象)或函数,[或超过数组末尾的指针]
唯一的定义&是"一元运算&符产生其操作数的地址.[...]结果是指向由其操作数指定的对象或函数的指针."(§6.5.3.2.3).遗憾的是,"地址"一词没有正式定义; 但是不同的对象(对于定义的等式==)具有不同的地址,因为地址是由上面的等式定义不同的指针.
至于含义const,§6.7.3并不表示const与对象的内容有关(在执行环境中是"数据存储区域,其内容可以通过§3.14表示值").脚注进一步表明"如果从不使用其地址,则实现不需要为这样的对象分配存储".虽然这是非规范性的,但强烈表明如果使用地址,则必须为每个对象分配存储.
请注意,如果对象是const volatile,则相当清楚(尽可能清楚volatile)它们不能具有相同的地址,因为实现const volatile对象是可变的.(§6.7.3.10有一个使用例子const volatile.)
即使在非易失性情况下,也const只表示程序的这一部分不允许修改对象,而不是通常对象是只读的.要将const对象的存储与其他东西合并,大胆的实现者必须保证没有任何东西可以修改对象.对于具有单独编译的实现中具有外部链接的对象而言,这是相当困难的(但当然,我们正在远离标准并进入未实践的实践领域).
如果这是关于编写C程序,那么您可以通过为对象提供不同的值来增加机会:
const int x = __LINE__;
const int y = __LINE__;
Run Code Online (Sandbox Code Playgroud)
如果这是关于C的理论模型,我会选择使对象区别开来.您必须通过在论文(扩展版)的段落中总结答案来证明这一选择.
另一方面,如果这是关于编写优化编译器,我怀疑它会伤害许多真实世界的程序来合并常量.我想在嵌入式编译器中进行合并,用户习惯于使用边缘情况安全地播放它,并且节省的内存可以是不可忽略的.我反对在托管平台上合并,任何收益都可以忽略不计.
(参考N1256又名C99 + TC3.我不认为版本会有所不同.)