合并重复文本时,C 编译器是否位于字符串中间



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

ISO c99 6.5.2.5 复合文字

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

简短的回答:可能。

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

然后可以优化该字符串池的内容,出现两次的相同字符串几乎肯定会被优化出来。我认为大多数编译器也会足够聪明地识别子字符串。但也有一些平台注意事项,例如对齐,因此仅仅因为存在子字符串,并不一定意味着重用该内存位置会最有效。

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

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

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

最新更新