也可将“全局区、常量区、Text(指令区) ”划为一个区域叫全局区(global)
|
左侧红色区域系统使用,左侧绿色的是我们可操作的区域
栈区(Stack)
局部变量
和函数运行过程中的上下文
堆区(Heap)存储
所有对象
全局区(Global)存储
全局变量、常量、代码区
堆栈溢出 :
堆有一定的空间,栈有一定的空间。
当堆
或者栈
需要使用内存空间的时候,就会进行其相应空间的向外拉伸(堆空间“向下”拉伸,栈空间“向上”拉伸),当他们的空间“重合”
的时候,我们就称之为堆栈溢出。
Segment & Section
我们研究内存结构的时候,研究的是Mach-O。
Mach-O
文件有多个段(segment)
,每个段有不同的功能。然后每个段又分为很多小的section
。
例如:
segment : TEXT、DATA
section : text、cstring、const、data 、bss、common
TEXT.text :机器码
TEXT.cstring :硬编码的字符串
TEXT.const :初始化过的常量
DATA.data :初始化过的可变的(静态/全局)数据
DATA.const :没有初始化过的常量
DATA.bss :没有初始化的(静态/全局)变量
DATA.common :没有初始化过的符号声明
简单举个列子理解
//全局
// ①初始化过的可变的(静态/全局)数据
// (存储在 DATA 这个segment 的 data section中。
int a = 10);
int b;//② 没有 初始化过的符号声明,(存储在DATA.bss中);
int main(int argc, char * argv[]) {
NSString * appDelegateClassName;
@autoreleasepool {
//③硬编码的字符串(存储在 TEXT.cstring中)
char * p = "YG";
NSLog(@"%s",p);
appDelegateClassName = NSStringFromClass([AppDelegate class]);
}
return UIApplicationMain(argc, argv, nil, appDelegateClassName);
}