【问题标题】:Are string references duplicated? [duplicate]字符串引用是否重复? [复制]
【发布时间】:2012-02-08 21:40:20
【问题描述】:

可能重复:
C/C++: Optimization of pointers to string constants

假设你在很多地方定义了一个字符串"example"

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

这些数据会被复制还是编译器只会引用它一次?

【问题讨论】:

  • 取决于编译器/链接器和选项。我相信整个程序优化和智能链接器会合并重复但不记得参考资料。

标签: c string optimization gcc


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    这是一个“实施细节”。这意味着一些智能编译器会统一内存中的字符串,而另一些会制作单独的副本。

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

    【讨论】:

    • 这不是定义的实现,因为实现不必记录此实现细节(根据实现定义的行为的要求),但这当然取决于实现。
    • @ouah 换句话说,它被记录为无证;-)
    • @ouah - 微妙的细节,很好的说明。编辑答案以避免混淆。
    【解决方案3】:

    这是一个实现细节,编译器编写者可以随意按照他们想要的方式进行操作。许多编译器确实有一个开关来控制重复的字符串常量是否引用相同的地址。

    【讨论】:

      猜你喜欢
      • 2021-07-22
      • 2020-09-20
      • 2012-07-16
      • 1970-01-01
      • 2011-06-08
      • 2015-11-12
      • 1970-01-01
      • 2023-03-31
      • 2018-10-17
      相关资源
      最近更新 更多