首页  >  文章  >  后端开发  >  为什么跨翻译单元的字符串文字具有不同的内存地址?

为什么跨翻译单元的字符串文字具有不同的内存地址?

Linda Hamilton
Linda Hamilton原创
2024-11-04 19:08:01478浏览

Why Do String Literals Across Translation Units Have Different Memory Addresses?

跨翻译单元的字符串文字地址不匹配

在 C 和 C 中,通常假设不同翻译单元(目标文件)中的字符串文字在编译期间创建的)将具有相同的内存地址。然而,这个想法不可跨编译器和实现移植。

根据 C99 和 C 草案标准,有关相同字符串文字的行为明确未指定。这意味着编译器可以自由地池化或合并它们,或者为每个引用创建单独的实例。

Visual Studio 明确允许通过 /GF 编译器选项进行字符串文字池化,而 GCC 通过 -fmerge-constants 支持它旗帜。但是,两个编译器都有条件地使用此功能,具体取决于特定硬件或链接器支持的可用性。

因此,跨不同翻译单元的字符串文字依赖相同的内存地址是不可移植的。即使在同一个翻译单元中,编译器优化在处理字符串文字时也可能会导致不可预测的行为。

这种标准化的缺乏是由于语言开发时 C 实现的多样性造成的。由于基于 ROM 的系统需要将字符串文字存储在只读存储器中,因此保证字符串文字的唯一性和可写性被认为是不切实际的。

以上是为什么跨翻译单元的字符串文字具有不同的内存地址?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn