Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 字符串引用是否重复?_C_String_Optimization_Gcc - Fatal编程技术网

C 字符串引用是否重复?

C 字符串引用是否重复?,c,string,optimization,gcc,C,String,Optimization,Gcc,可能重复: 假设您在许多地方定义了一个字符串“example” // module1.h char *x = "example"; // module2.h char *a[] = { "text", "example" }; // module3.c printf("example"); //etc. 这些数据将被复制,还是编译器只对其进行一次引用?这是一个实现细节,编译器编写者可以自由地以任何方式执行。许多编译器都有一个开关来控制重复的字符串常量是否引用相同的地址。这是一个“实现细节”。

可能重复:

假设您在许多地方定义了一个字符串
“example”

// module1.h
char *x = "example";
// module2.h
char *a[] = { "text", "example" };
// module3.c
printf("example");
//etc.

这些数据将被复制,还是编译器只对其进行一次引用?

这是一个实现细节,编译器编写者可以自由地以任何方式执行。许多编译器都有一个开关来控制重复的字符串常量是否引用相同的地址。

这是一个“实现细节”。这意味着一些智能编译器将统一内存中的字符串,而其他编译器将创建单独的副本


最后,有些编译器会用某些编译器选项做一件事,而用其他选项做其他事情…

这取决于实现。但这就是字符串文字不可变属性的精神所在

引用C99关于字符串文字的基本原理:

字符串文本不需要修改。此规范允许实现共享具有相同文本的字符串副本,将字符串文本放入只读内存,并执行某些优化


取决于编译器/链接器和选项。我相信整个程序优化和智能链接器将结合重复的内容,但不记得参考资料。这不是实现定义,因为实现不必记录此实现细节(根据实现定义行为的要求)但这当然取决于实现。@噢,换句话说,它被记录为未记录;-)@啊-微妙的细节,很好的澄清。编辑答案以避免混淆。