Cocoa 应用程序中有哪些不同类型的内存地址?
What are the different types of memory addresses in a Cocoa application?
每当我在我的 Cocoa 应用程序中查看内存地址时,我都会注意到(通常)地址的 3 个主要类别
0x00006xxxxxxx
0x00007fffxxxx
0x0000001xxxxx
我知道什么是什么——就像我注意到 0x00006xxxxxxx
地址似乎是指向我的应用程序对象的 指针 ?
和0x0000001xxxxx
似乎是内存中实际对象的地址?
但我真的什么都不确定,无法形成良好的 Google 查询来给我答案。
有没有人有资源,或者知道如何识别 Cocoa 应用程序中的地址类别?
Does anybody have a resource, or know how to identify the categories
of addresses in a Cocoa application?
地址本身不属于类别——地址就是地址。但确实有不同的内存区域用于不同的事物,特别是堆栈和堆。在包括 MacOS 在内的许多系统上,堆从相对较低的地址开始向上增长(地址增加),而堆栈从高地址开始向下增长。
Objective-C 对象总是在堆上分配并通过指针访问,因此对象本身的地址具有低地址是有意义的,而指向对象的指针(通常是全局或局部变量存储在堆栈)具有高地址。全局变量存在于堆栈的底部,因此它们将比局部变量具有更高的地址(同样,堆栈向下增长)。
尽管有前一段,但不要假设地址表示存储在该位置的事物的类型。虽然您通常不会在堆栈上找到 Objective-C 对象,但您肯定会在堆中的地址处找到大量对象指针,因为对象包含指向其他对象的指针。同样,您可能会发现其他类型的数据块:原始数据类型(int
、char
等)、C 风格数组、数据缓冲区、块等
可能还有一些其他区域我遗漏了,例如代码段的 space,但这是一般的想法。了解内存的组织方式通常很有帮助,但同时您应该避免编写依赖于这些知识的代码,除非您正在编写需要它的软件(例如调试器)。
如果您想了解更多信息,可以从 Mike Ash 的几篇博文开始:
每当我在我的 Cocoa 应用程序中查看内存地址时,我都会注意到(通常)地址的 3 个主要类别
0x00006xxxxxxx
0x00007fffxxxx
0x0000001xxxxx
我知道什么是什么——就像我注意到 0x00006xxxxxxx
地址似乎是指向我的应用程序对象的 指针 ?
和0x0000001xxxxx
似乎是内存中实际对象的地址?
但我真的什么都不确定,无法形成良好的 Google 查询来给我答案。
有没有人有资源,或者知道如何识别 Cocoa 应用程序中的地址类别?
Does anybody have a resource, or know how to identify the categories of addresses in a Cocoa application?
地址本身不属于类别——地址就是地址。但确实有不同的内存区域用于不同的事物,特别是堆栈和堆。在包括 MacOS 在内的许多系统上,堆从相对较低的地址开始向上增长(地址增加),而堆栈从高地址开始向下增长。
Objective-C 对象总是在堆上分配并通过指针访问,因此对象本身的地址具有低地址是有意义的,而指向对象的指针(通常是全局或局部变量存储在堆栈)具有高地址。全局变量存在于堆栈的底部,因此它们将比局部变量具有更高的地址(同样,堆栈向下增长)。
尽管有前一段,但不要假设地址表示存储在该位置的事物的类型。虽然您通常不会在堆栈上找到 Objective-C 对象,但您肯定会在堆中的地址处找到大量对象指针,因为对象包含指向其他对象的指针。同样,您可能会发现其他类型的数据块:原始数据类型(int
、char
等)、C 风格数组、数据缓冲区、块等
可能还有一些其他区域我遗漏了,例如代码段的 space,但这是一般的想法。了解内存的组织方式通常很有帮助,但同时您应该避免编写依赖于这些知识的代码,除非您正在编写需要它的软件(例如调试器)。
如果您想了解更多信息,可以从 Mike Ash 的几篇博文开始: