在合并重复的文字时,C编译器会在字符串的中间查找吗?

时间:2012-11-26 10:46:50

标签: c compiler-optimization

我的源代码中有很多文字字符串,除了前导空格之外都是相同的(由于希望保持正确的缩进)。编译器是否足够聪明,可以看到它可以在内存中重用两个空间,只需将一个字符串偏移几个字节?

3 个答案:

答案 0 :(得分:1)

ISO c99 6.5.2.5复合文字

83)这允许实现共享字符串文字和常量复合文字的存储,具有相同或重叠的表示。

答案 1 :(得分:1)

简短回答:可能。

答案很长:这取决于实施情况。通常,C编译器具有称为“字符串池”或类似的优化器功能,这使编译器能够将所有字符串文字相邻地存储在ROM中。

然后可以优化该字符串池的内容,出现两次的相同字符串几乎肯定会被优化掉。我认为大多数编译器也足够智能识别子字符串。但也存在平台考虑因素,例如对齐,因此只是因为存在子字符串,并不一定意味着重用该内存位置最有效。

C标准中没有任何内容保证完成此类优化。但与此同时,标准中没有任何内容阻止它。

可以肯定的是,您必须检查特定编译器的文档,或者反汇编程序,或检查链接器输出。

答案 2 :(得分:-4)

简单回答:不。我不知道有任何编译器这样做。