GCC 可以合并重复的全局字符串数组吗?

Yur*_*uri 5 c gcc compiler-optimization

我一直想知道是否可以使用带有一些优化标志的 GCC 进行编译以避免 .rodata 部分有两个重复的数组?因此,内存地址将是相同的。例如:

\n\n
const char str [7] = "string";\n\nconst char str1 [7] = "string";\n\n\nint printf (const char * format, ...);\n\nint main (void) {\n\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0 if (str == str1)\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0 printf ("Equal memory addresses");\n\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0 return 0;\n\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

那么在上面的例子中,编译器是否有可能以某种方式使用相同的内存地址?

\n

Cor*_*lks 6

GCC 的-fmerge-all-constants(这也意味着-fmerge-constants)可以解决这个问题。它的文档:

-fmerge-all-constants

尝试合并相同的常量和相同的变量。

该选项意味着-fmerge-constants. 除此之外,-fmerge-constants甚至还考虑常量初始化数组或具有整型或浮点类型的初始化常量变量。C 或 C++ 等语言要求每个变量(包括递归调用中同一变量的多个实例)具有不同的位置,因此使用此选项会导致不一致的行为。

请注意,GCC 不保证常量将被合并,因此您不应依赖于此来实现程序行为。它将尝试合并它可以合并的内容,但某些常量可能无法合并。

输入代码:

#include <stdio.h>

const char str1[7] = "string";
const char str2[7] = "string";

int main() {
    puts(str1);
    puts(str2);
}
Run Code Online (Sandbox Code Playgroud)

输出组件:

main:
        sub     rsp, 8
        mov     edi, OFFSET FLAT:str1
        call    puts
        mov     edi, OFFSET FLAT:_ZL4str2
        call    puts
        xor     eax, eax
        add     rsp, 8
        ret
str1:
        .string "string"
Run Code Online (Sandbox Code Playgroud)