【问题标题】:Does multiple #define of the same string use the same constant string?同一字符串的多个#define 是否使用相同的常量字符串?
【发布时间】:2013-07-01 21:31:37
【问题描述】:

同一个字符串的多个#define 是否使用同一个常量字符串?假设我在多个地方执行以下操作:

#define TEST @"test"

编译器足够聪明,知道它引用了数据部分中的相同常量字符串,对吧?

【问题讨论】:

  • 取决于您的编译器和编译器设置,但该字符串从不在堆中。
  • 字符串应该以二进制文件的.rodata结尾。
  • 我的错,应该是数据部分。

标签: c++ objective-c c c-preprocessor


【解决方案1】:

确实,您的问题与 #define 的作用没有太大关系,而是与编译器如何处理字符串文字有关。编译器将字符串对象插入到程序映像中,这是只读的并且不实现保留计数。这是一种优化,因此不需要在运行时创建字符串。

通常编译器足够聪明,可以识别出你正在使用相同的字符串字面量,并且会使用相同的常量字符串,但它不会在堆中。

同时检查这个问题:Authoritative description of ObjectiveC string literals?

【讨论】:

    【解决方案2】:

    编译器会做一些叫做字符串实习的事情。这不是必要的操作,因此如果您的代码依赖于 test 位于同一地址,那么您可能会遇到一些问题。在大多数情况下是的,它会尝试重用相同的字符串,并让它们都指向同一个字符串(在只读内存中)。

    【讨论】:

      猜你喜欢
      • 2011-10-07
      • 1970-01-01
      • 1970-01-01
      • 2013-09-10
      • 2020-08-31
      • 2012-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多