全局常量中较少的内存使用量

时间:2014-02-19 13:36:24

标签: ios objective-c memory

定义全局常量的方法很少:define,static const,extern ......等。 消耗较少内存的是什么? 我的.pch文件中有很多常量。

3 个答案:

答案 0 :(得分:4)

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

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

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

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

答案 1 :(得分:1)

首先,我想说你的常量范围比它们消耗的内存更重要。

其次,取决于你的常量的内容,#define这是一个预处理器动作可能是好的,因为它直接将结果注入你的代码。如果你对常量的使用很少,那就太好了。否则,在手中它都是一样的。因为它是const,所以你的对象将在运行时存储一次(或者取决于范围,每个类或每个对象一次)。

但实际上,除非你拥有数十万个变量,否则它不应该对记忆产生真正的影响。相信编译器可以处理它。

答案 2 :(得分:1)

extern将比静态消耗更少的内存,因为static使用导入的头文件为每个文件创建一个常量,extern为每个应用程序创建一个常量。