字符串引用是否会被复制?

5

可能是重复的问题:
C/C++: 优化指向字符串常量的指针

假设您在许多地方都定义了字符串"example"

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

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

取决于编译器/链接器和选项。我相信整个程序优化和智能链接器将合并重复内容,但不记得参考资料了。 - JimR
3个回答

8

这取决于具体的实现。但这正是字符串字面值不可变属性的精神所在。

引用 C99 对字符串字面值的解释:

“字符串字面值并不要求可修改。 此规范允许实现共享相同文本的字符串副本,将字符串字面值放置在只读内存中,并执行某些优化。”


2

这是一个“实现细节”。这意味着一些聪明的编译器会在内存中统一字符串,而其他编译器则会制作分离的副本。

最后,一些编译器将使用某些编译器选项执行一项操作,而使用其他选项执行其他操作...


这并非“实现定义”(implementation defined)的意思,因为实现不必记录此实现细节(如实现定义行为所要求的那样),但当然这取决于具体实现。 - ouah
换句话说,它被记录为未记录的;-) - Neil
@ouah - 微妙的细节,很好的澄清。编辑了答案以避免混淆。 - rodrigo

0

那是一個實現細節,編譯器的作者可以任意選擇實現方式。許多編譯器都有一個開關用於控制是否將重複的字符串常量指向同一地址。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接