全局指针内存使用情况

时间:2013-05-24 18:22:38

标签: ios objective-c memory-management global-variables

我想清楚我关于全局指针记忆的基础知识,有些正文可以帮助我理解全局常量的记忆影响;

// This is define out of interface on top of .m file
NSString *const kXyz  = @"xyz";

它是否影响内存使用,为什么我问这个因为我可能会也可能不会使用这个常量所以我想有一个MACRO

#define G_XYZ @"xyz"

并在if语句中使用此而不是全局常量来节省内存,因为MACRO将在编译时删除,我将节省一些内存。

我的理解是否正确MACROS和Global const?

2 个答案:

答案 0 :(得分:0)

不,使用像:

这样的宏
#define G_XYZ @"xyz"
NSString *s = G_XYZ;

将被预处理为:

NSString *s = @"xyz";

因此,在预处理步骤之后,两者将是相同的。

如果您想查看要对其进行预处理的代码,请尝试gcc -E myfile.c

你可以写一个标题:

extern NSString *g_xyz;

在一个源文件中:

NSString *g_xyz = @"xyz";

在其他源文件中,您可以使用此值:

NSLog(g_xyz);

然而,除非字符串很大或者有很多字符串,否则这真的不值得考虑。即使是一个空程序也可能是几KB,所以除非在极端情况下(你可能不会使用Objective C),所以不需要削减几个字节。

答案 1 :(得分:0)

建议使用常量。除非你处于一个非常受内存限制的环境中,否则如果你不使用它就会浪费内存。框架充满了这样的常量。

然而,为了帮助理解:常量将为字符串本身使用内存,并为常量自己的存储使用一个指针大小的内存块 - 通常为4或8个字节。除非那是你不使用它,编译器或链接器能够删除它;如果常量是全局可访问的,则不太可能,如果它是文件范围(静态)常量,则更有可能。宏的内存使用也依赖于编译器/链接器,但可能超过常量 - 考虑到在宏处理之后,编译器会看到相同文字字符串的多次使用,可能在不同的文件中。

因此,除非你很好地了解你的编译器/链接器,并且它没有改变,否则你正在考虑可能性:

  1. 常量很可能消耗少量固定内存。
  2. 如果不使用,宏将不会消耗任何内存。
  3. 如果只使用一次宏将消耗与常量相同的内存,则差异(如果有的话)可以忽略不计。
  4. 如果在同一个文件中多次使用,宏可能会占用更多内存。
  5. 如果在多个文件中多次使用,宏可能会占用更多内存。
  6. 总之,如果使用字符串,常量可能会使用更少的内存,最多可以使用更多的内存,所以除非你受到很大的内存限制,否则不要担心它;或直到记忆成为一个问题。但理解很好!