为什么必须允许将等效的字符串文字存储在不同的静态存储位置

mid*_*dor 6 c string language-lawyer

我知道C标准允许将具有相同内容的字符串文字存储在不同的位置,至少这是我被告知的内容,以及我从SO上的其他帖子中拿走的内容,例如这个这个.然而,令我感到奇怪的是,标准不要求这些文字的位置相等,因为它可以保证较小的可执行文件并加快对字符串文字的相等性检查,使它们成为O(1)操作而不是O(n) ).

我想知道什么论点 - 来自实施者POV - 使其具有吸引力,允许这些文字的位置不同.编译器是否进行了任何类型的优化以节省比较文字的位置无关紧要?我很清楚,如果您将文字与指向包含相同字符串的不同位置的变量进行比较,那么在该位置进行这样的比较将是无用的,但我试图理解制作标准的人如何看待这个.

我可以想到为什么你不想这样做的论点,例如你可能会引入的细微错误,当你基于位置进行比较时,标准所支持的操作,但我对我能想到的内容并不完全满意.

我希望你们中的一些人能够阐明这一点.

编辑1:首先感谢您的回答和评论.除此之外,我想对给出的一些答案添加一些想法:

@hvd:我认为这是特定额外优化的问题,而不是每个字符串文字都有一个实例的想法.

@Shafik:我认为你的问题让我清楚地知道为什么这样的结论不允许有很多有用的用法.它只能用于仅限于翻译单元范围的代码中.一旦具有相同字符串文字的两个文件彼此独立编译,两者都将在它们自己的位置包含它们自己的字符串文字.对象必须使用外部引用,或者每次与包含相同文字的其他对象组合时重新编译.

我认为我已经充分相信,John Bollinger和FUZxxl建议的不那么严格的实现规范是可取的,因为JUST指定每个转换单元只能存在一次字符串文字.

小智 7

除了那些只想避免做不必要的工作的旧编译器之外,即使在今天这个要求也不一定有用.

假设你有一个字符串文字一个转换单元"a""ba".假设您还有一个优化编译器,可以通知该转换单元"a"可以优化"ba"+1.

现在,假设你有一个字符串文字另译单元"a""ca".然后,将相同的编译器将优化翻译单元的"a""ca"+1.

如果第一个翻译单元"a"必须与第二个翻译单元相比较"a",则编译器不能合并这样的字符串,即使这是节省空间的有用优化.(正如FUZxxl在评论中指出的那样,一些链接器会这样做,如果使用其中一个链接器,编译器就不需要了.但是并非所有链接器都这样做,所以在编译器中它仍然是值得的优化.)


fuz*_*fuz 5

传统上,C标准的编写方式使得编写基本的C编译器成为一项相对简单的任务.这很重要,因为C语言无处不在,C编译器通常是需要在新平台上提供的第一件事.

出于这个原因,C标准确实如此

  • 提供类似register关键字的语法来帮助哑编译器,
  • 不要求任何优化,
  • 没有指明其行为的许多方面.