【发布时间】:2018-10-31 05:55:09
【问题描述】:
我一直想知道是否可以使用带有一些优化标志的 GCC 进行编译以避免 .rodata 部分有两个重复的数组?因此,内存地址将是相同的。例如:
const char str [7] = "string";
const char str1 [7] = "string";
int printf (const char * format, ...);
int main (void) {
if (str == str1)
printf ("Equal memory addresses");
return 0;
}
那么在上面这个例子中,编译器是否有可能以某种方式使用相同的内存地址?
【问题讨论】:
-
是的,很可能只有一个
"string"的副本包含在可执行字符串表中,并且在每个分配中都被引用。对于那些字符串文字是不可变的并且在可执行文件的只读部分中创建的操作系统来说尤其如此。 (没有理由重复不会改变的内容)但这并非适用于所有操作系统,并且有一些编译器选项可以控制某些编译器上的这种行为。 -
@DavidC.Rankin: Without
-fmerge-all-constants, GCC will duplicate the string into two separate global variables(尽管具体行为取决于您的类型是const char *还是const char [N])。当然,如果程序像 OP 一样简单,那么优化器可以优化整个事情,然后生成的二进制文件中不会有 任何 字符串。 -
@DavidC.Rankin It's standards-conforming to merge string literals, but not required。请注意,指向字符串文字的指针与字符串数组不同,这也是我在上面关于
const char*与const char[N]的评论中最初提到的。如果您创建指向字符串文字的const char*,则这些字符串可能会被合并。但是如果你创建const char[N],那些字符串不能被合并(至少不能没有-fmerge-all-constants,这会导致不符合的行为)。 -
这是一个骗子,但链接的帖子质量较低。我关闭了链接作为欺骗这个链接。
标签: c gcc compiler-optimization