同一个字符串的多个#define是否使用相同的常量字符串?

时间:2013-07-01 21:31:38

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

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

#define TEST @"test"

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

2 个答案:

答案 0 :(得分:2)

确实,你的问题与 #define 所做的事情没什么关系,而是与编译器如何处理字符串文字有关。编译器将字符串对象插入到程序映像中,该映像是只读的,不会实现保留计数。这是一个优化,因此不需要在运行时创建字符串。

通常,编译器足够聪明地识别出您使用相同的字符串文字,并且将使用相同的常量字符串,但它不会在堆中。

另请查看此问题:Authoritative description of ObjectiveC string literals?

答案 1 :(得分:1)

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