0

我想清除有关全局指针内存的基础知识,能否帮助我了解全局常量的内存影响;

// 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 的理解是否正确?

4

2 回答 2

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)。

于 2013-05-24T18:37:04.440 回答
0

建议使用常量。除非您处于内存非常有限的环境中,否则如果您不使用它,那么浪费的内存是很微小的。框架中充满了这样的常量。

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

因此,除非您非常了解您的编译器/链接器,并且它不会改变,否则您正在考虑可能性:

  1. 该常量很可能会消耗少量固定的内存。
  2. 如果不使用宏将不消耗内存。
  3. 如果只使用一次宏将消耗与常量相同的内存,则差异(如果有)将可以忽略不计。
  4. 如果在同一个文件中多次使用,宏可能会使用更多内存。
  5. 如果在多个文件中多次使用,宏可能会使用更多内存。

总之,如果使用字符串,常量可能会使用更少的内存,最多可以忽略不计,所以不要担心,除非你的内存非常有限;或者直到内存成为问题。不过理解就好!

于 2013-05-24T19:16:01.327 回答