On 02/03/2021 15.28, Geert Uytterhoeven wrote: > Fortunately gcc is already smart enough to deduplicate identical strings, > but only in the same source file.
Yeah, gcc can't do much more since it only handles one source file at a time. However, the linker certainly deduplicates strings across translation units :) I don't think gcc bothers to do the tail merging since the linker does it, but that may depend on optimization level and gcc version; it does seem to merge identical strings within a TU, at least in very simple cases. Rasmus $ grep . *.c a.c:const char *a1(void) { return "string"; } a.c:const char *a2(void) { return "string"; } a.c:const char *a3(void) { return "longer string"; } b.c:const char *b1(void) { return "string"; } b.c:const char *b2(void) { return "longer string"; } b.c:const char *b3(void) { return "much longer string"; } main.c:#include <stdio.h> main.c:const char *a1(void); main.c:const char *a2(void); main.c:const char *a3(void); main.c:const char *b1(void); main.c:const char *b2(void); main.c:const char *b3(void); main.c:int main(int argc, char *argv[]) main.c:{ main.c:#define p(x) printf("%s(): %p - [%s]\n", #x, x(), x()) main.c: p(a1); main.c: p(a2); main.c: p(a3); main.c: p(b1); main.c: p(b2); main.c: p(b3); main.c: main.c: return 0; main.c:} $ gcc -O2 -o a.o -c a.c ; gcc -O2 -o b.o -c b.c ; gcc -O2 -o main.o -c main.c ; gcc -o main main.o a.o b.o ; ./main a1(): 0x560b1bc3d033 - [string] a2(): 0x560b1bc3d033 - [string] a3(): 0x560b1bc3d02c - [longer string] b1(): 0x560b1bc3d033 - [string] b2(): 0x560b1bc3d02c - [longer string] b3(): 0x560b1bc3d027 - [much longer string]