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

时间:2014-02-27 14:00:57

标签: 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 setValue:xyz forKey:@"foobar"];
[thing2 setValue:abc forKey:@"foobar"];
[thing3 setValue:def forKey:@"foobar"];
[thing4 setValue:ghi forKey:@"foobar"];

或者编译器将事情排序并将@"foobar"的所有实例合并到TEXT部分的单个引用中

上下文...

我继承了大量的源代码,其中大多数键表示为字符串文字而不是字符串常量。它不是我的,所有者不会为此付出高昂的代价。是否有时间花时间在运行时视图中对字符串进行constantifying。

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

1 个答案:

答案 0 :(得分:2)

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

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

如果kFoobar是某种实例或全局var,那么指针var本身就会占用实例或全局空间,但它没有其他效果。

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