1 从低地址开始,依次是代码区,数据区(包含静态数据区、常量数据区)、堆(自下向上生长)、动态库的文件映射、栈
2 函数压栈:从高地址到低地址(也是从栈底到栈顶)来看,先是函数参数从右向左,然后是返回地址(调用函数前的下一行代码),被调用函数地址,EBP/ESP,局部变量(按从上到下的声明顺序)
3 不同线程的栈有一定的间距,基本等同于线程栈的限制大小,线程切换前会保存当前线程的栈顶,这样当再次切换回来时,可以从栈顶向下分配
4 程序的有些内存之存在虚拟地址空间,如果实际没有使用,在某些编译器和操作系统上,不会分配实际的物理内存
5 动态库方面,有些正如文件映射的性质,只是指向内核中的共享内存,有些则是自己的私有内存,如果一定要算内存大小,应该是私有内存+共享内存(使用进程数),具体使用可以看/proc/<process id>/smaps