跨翻译单元的字符串文字地址不匹配
在 C 和 C 中,通常假设不同翻译单元(目标文件)中的字符串文字在编译期间创建的)将具有相同的内存地址。然而,这个想法不可跨编译器和实现移植。
根据 C99 和 C 草案标准,有关相同字符串文字的行为明确未指定。这意味着编译器可以自由地池化或合并它们,或者为每个引用创建单独的实例。
Visual Studio 明确允许通过 /GF 编译器选项进行字符串文字池化,而 GCC 通过 -fmerge-constants 支持它旗帜。但是,两个编译器都有条件地使用此功能,具体取决于特定硬件或链接器支持的可用性。
因此,跨不同翻译单元的字符串文字依赖相同的内存地址是不可移植的。即使在同一个翻译单元中,编译器优化在处理字符串文字时也可能会导致不可预测的行为。
这种标准化的缺乏是由于语言开发时 C 实现的多样性造成的。由于基于 ROM 的系统需要将字符串文字存储在只读存储器中,因此保证字符串文字的唯一性和可写性被认为是不切实际的。
以上是为什么跨翻译单元的字符串文字具有不同的内存地址?的详细内容。更多信息请关注PHP中文网其他相关文章!