重复的objective-c字符串文字是否使用更多的运行时内存

重复的objective-c字符串文字是否使用更多的运行时内存,objective-c,compiler-construction,nsstring,Objective C,Compiler Construction,Nsstring,把好的编程实践放在一边。之后我会给出上下文 关于Objective-C字符串文本@“foobar” 这个结构 NSString *kFoobar = @"foobar"; [thing1 setValue:xyz forKey:kFoobar]; [thing2 setValue:abc forKey:kFoobar]; [thing3 setValue:def forKey:kFoobar]; [thing4 setValue:ghi forKey:kFoobar]; [thing1 se

把好的编程实践放在一边。之后我会给出上下文

关于Objective-C字符串文本
@“foobar”

这个结构

NSString *kFoobar = @"foobar";

[thing1 setValue:xyz forKey:kFoobar];
[thing2 setValue:abc forKey:kFoobar];
[thing3 setValue:def forKey:kFoobar];
[thing4 setValue:ghi forKey:kFoobar];
[thing1 setValue:xyz forKey:@"foobar"];
[thing2 setValue:abc forKey:@"foobar"];
[thing3 setValue:def forKey:@"foobar"];
[thing4 setValue:ghi forKey:@"foobar"];
使用比此结构更多的运行时内存

NSString *kFoobar = @"foobar";

[thing1 setValue:xyz forKey:kFoobar];
[thing2 setValue:abc forKey:kFoobar];
[thing3 setValue:def forKey:kFoobar];
[thing4 setValue:ghi forKey:kFoobar];
[thing1 setValue:xyz forKey:@"foobar"];
[thing2 setValue:abc forKey:@"foobar"];
[thing3 setValue:def forKey:@"foobar"];
[thing4 setValue:ghi forKey:@"foobar"];
或者编译器是否将所有
@“foobar”
的实例整理并合并到文本部分的单个引用中

上下文…

我继承了大量源代码,其中大多数键都表示为字符串文字而不是字符串常量。这不是我的,店主也不会为“好东西”付钱。在运行时视图中花时间固定字符串是否有意义


我确实通过
字符串
传递了exe,它看起来好像是编译器完成了繁重的工作,但我不确定。

这两者在所有意图和目的上都是相同的。每个编译单元只创建给定文字字符串的一个实例。(事实上,在某些情况下甚至更少,因为系统会尝试将它们结合起来。)

第一个示例中使用的var
kFoobar
,如果是本地var,则是一个临时变量,可能永远不会超过一个寄存器。它最多会占用堆栈帧中的8个字节,该帧在方法退出时消失。对于第二种情况,编译器可能会加载一个指向文本的temp。因此,这两个示例的代码实际上可能是相同的

如果
kFoobar
是某种实例或全局变量,那么指针变量本身当然会占用实例或全局空间,但不会产生其他影响


NSMutableDictionary不需要制作字符串的本地副本(当它用作键时),因为NSString是不可变的。单个副本由所有引用对象共享。

无论出于何种目的,这两个副本都是相同的。每个编译单元只创建给定文字字符串的一个实例。(事实上,在某些情况下甚至更少。)(NSMutableDictionary不需要制作字符串的本地副本,因为NSString是不可变的。)@HotLicks和链接器将所有字符串文字合并为一个,在第一个结构中,您需要为
*kFoobar
指针分配额外的内存,不?@MykolaDenysyuk-那将是暂时的,可能永远不会超过一个注册。堆栈帧中最多有个字节在方法退出时消失。对于第二种情况,编译器可能会加载一个指向文本的temp。所以这两个的代码实际上可能是相同的。@HotLicks谢谢您的评论。把这句话作为回答,我会接受的。