当前位置:网站首页>数据在内存如何分布的?
数据在内存如何分布的?
2022-08-08 03:34:00 【皆自落】
目录
常量区:
.code或.text,代码段:
用来存放可执行的机器指令的一块内存区域,这部分区域的代码属于只读。字符串常量也在也在代码段上。
静态区:
.data,数据段:
用来存放程序中已初始化的全局变量的一块内存区域,例如已初始化的全局变量和局部静态变量(初始化为非0)。
.bss:
用来存放程序中未初始化的全局变量的一块内存区域,例如未初始化的全局变量和局部静态变量(未初始化或初始化为0)。
data段(初始化的段),bss(未初始化的段)都是针对全局变量和静态变量来说的。
data又分为读写数据段,和只读数据段。
bss是未初始化的全局变量和静态变量,以及初始化为0的全局变量和静态变量。
堆(heap):
用来存放进程运行中被动态分配的内存段,大小并不固定,可动态扩张或缩减,典型操作malloc和free。堆的申请过程比较复杂,当系统收到程序的申请时,会遍历记录空闲内存地址的链表,以寻找第一个空间大于所申请空间的堆结点,然后将该结点从空闲结点链表中删除,并将该结点的空间分配给程序。
栈(stack):
存放程序的局部变量,以及函数调用时候,栈用来传递参数和返回值。由于栈的先进后出的特点,特别方便用来保存和回复调用现场。

让我们直观感受一下:
int a = 0; // 全局初始化区
char *p1; // 全局未初始化区
int main(int argc, const char *argv[])
{
int b; // 栈
char s[] = "abc"; // 栈
char *p2; // 栈
char *p3 = "123456"; // 123456\0在常量区,而p3在栈上
static int c = 0; // 全局(静态)初始化区
p1 = (char *)malloc(10);
p2 = (char *)malloc(20); // 分配得来得10和20字节的区域在堆区
strcpy(p1, "123456"); // 123456\0放在常量区,编译器可能会将它与p3所指向的"123456"优化成一个地方。
return 0;
}
那么栈和堆有什么不同呢?
分配方式不同
栈: 由系统自动分配,速度快,空间较小。 例如,声明在函数中一个局部变量 int b; 系统自动在栈中为 b 开辟空间。
堆: 需要程序员自己申请,并指明大小,速度较慢,空间较大,在c中 malloc 函数。需要程序员自己释放。
如 p1 = (char *)malloc(10); 在 C++ 中用 new 运算符
如 p2 = (char *)new(10); 但是注意 p1、p2 本身是在栈中的。
生长方向不同
栈是由高地址向低地址增长,
堆是由低地址向高地址增长。
底层不同
栈是连续的空间,
而堆是不连续的空间。
边栏推荐
- The Spark based RDD partition and parallel degree 】 【
- Task Scheduling Framework Quartz Read the article
- 监控工具Prometheus及项目总结,220805,,
- RV-GAN:使用新的多尺度生成对抗网络分割眼底照片中的视网膜血管结构
- 典型的数据仓库建模方法论
- PC博物馆(番外01)-城会玩,初中生开发实体尺规大航海游戏
- ORACLE数据库重启后连接异常
- ICML 2022 | LeNSE: 基于子图的大规模组合优化: 实现了 140 多倍的速度提升
- Overseas Metaverse media must pay attention to the integrity of the propaganda
- SIGIR'22 | Joint optimization of inter-ad ordering and intra-ad creative prioritization
猜你喜欢

RV-GAN: Segmentation of retinal vascular structures in fundus photographs using a novel multi-scale generative adversarial network

Flume (三) --------- Flume 进阶

任务调度框架 Quartz 一文读懂

程序中的负数存储及类型转换

vulnhub-DC-5 target drone penetration record

Build a personal network disk using z-file and Qiniu cloud object storage

找素数问题

新零售项目及离线数仓核心面试,,220807,,

136. Single Number只出现一次的数字

The live broadcast of agricultural products continues to heat up, Economic Daily: Don’t forget quality when rushing
随机推荐
第4周 一步步搭建多层神经网络以及应用(1 & 2)
The difference between orElse and orElseGet in Optional
力扣第 84 场双周赛
Optional中orElse和orElseGet的区别
JVM调优的策略
C# "Original CSharp" 4th Chapter It is common for people to change in time, but it is difficult to know the succession of humanities
Monitoring tool Prometheus and project summary, 220805,,
The project management process and key points for each link
力扣第 305 场周赛
Bluetooth att gatt agreement
ORACLE数据库重启后连接异常
Lecture 84th Biweekly
CGAN theory explanation and code implementation
egg-Alibaba Cloud SMS Configuration
数据库缓冲区高速缓存中块的类型
ICML 2022 | LeNSE: Subgraph-Based Large-Scale Combinatorial Optimization: Achieving Over 140x Speedup
mfc对话框添加OnMouseMove
项目管理流程及各环节要点
VSCode打开 C(嵌入式) 工程的一些记录
【保研面试】英文问题