【前言】Swift-内存区域的基本概念和认知

code_小马swift
内存区域简单划分.png
也可将“全局区、常量区、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);
}

你可能感兴趣的:(【前言】Swift-内存区域的基本概念和认知)