C++面向对象编程(4)——浅谈C++内存模型

编程入门 行业动态 更新时间:2024-10-22 21:33:37

C++面向对象编程(4)——<a href=https://www.elefans.com/category/jswz/34/1769825.html style=浅谈C++内存模型"/>

C++面向对象编程(4)——浅谈C++内存模型

目录

 

一. 说明

二. GDB实验

2.1 实验1:栈

2.2 实验2:堆


 

一. 说明

不同的操作系统对程序内存的管理和划分会有所不同。如上图所示的C++内存区域划分主要是针对一般的情况,说明如下:

1. Stack:栈。由编译器管理分配和回收,存放局部变量和函数参数。

2. Heap:堆。由程序员管理,需要⼿动 new malloc delete free 进⾏分配和回收,空间较⼤,但可能会出现内存泄漏和空闲碎⽚的情况。

3. 内存映射段:高效的I/O映射方式,用于装载共享的动态内存库等。

4. 全局/静态存储区

    (1) BSS Segment:Block Started by Symbol,属于静态内存分配,用来存储未初始化的全局变量和静态变量。

    (2) Data Segment:数据段。存储已经初始化了的全局变量和和静态变量。

5. Text Segment:代码区,通常也被称为文本区或只读区。存放程序的二进制代码和常量,代码段是只读的,可以被多个进程共享;也有认为常量存储区 在内存中是独立的,C++标准并没有明确将常量存储区单独列为内存分区模型的一部分。

二. GDB实验

#include <iostream>
using namespace std;int main(int argc, char** argv)
{int size = 100;char c = 'x';int* heap1 = (int*) malloc(sizeof(int));int* heap2 = (int*) malloc(sizeof(int));return 0;
}

2.1 实验1:栈

int size = 100;
char c = 'x';

从变量size地址(0x7fffffffdbdc)和变量c地址((0x7fffffffdbdb))可知:栈是从高地址向低地址伸展分配的。

2.2 实验2:堆

int* heap1 = (int*) malloc(sizeof(int));
int* heap2 = (int*) malloc(sizeof(int));

 

heap1/heap2是局部变量,放在栈上,可以看到他们地址0x7fffffff....是比较高的;而这两个变量所指向的地址是堆的地址,可以看到堆的地址(0x55555...)就相对栈的地址是比较低且是从低地址向高地址伸展(b0->d0)分配的。

 

更多推荐

C++面向对象编程(4)——浅谈C++内存模型

本文发布于:2023-11-15 01:07:22,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1590974.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:浅谈   面向对象   模型   内存

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!