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

目录

[一. 说明](#一. 说明)

[二. GDB实验](#二. GDB实验)

[2.1 实验1:栈](#2.1 实验1:栈)

[2.2 实验2:堆](#2.2 实验2:堆)


一. 说明

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

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

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

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

  2. 全局/静态存储区

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

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

  1. 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)分配的。

相关推荐
码匠许师傅5 小时前
【C++ 面试真题】26. 聊聊 C++ 的智能指针
java·c++·面试
夜不会漫长10 小时前
C++入门(1)
开发语言·c++·算法
旖旎夜光12 小时前
LeetCode 852:山脉数组的峰顶索引(二分查找) —— 题解
数据结构·c++·算法·leetcode·二分查找
..Dauntless..12 小时前
【C++】继承——基类和派生类的配合
开发语言·c++·算法
程与留12 小时前
05_Qt 核心模块概览——Qt Core、Gui、Widgets、Quick 的职责划分
c++·qt
buhuizhiyuci12 小时前
【QT-百日筑基篇】修真世界摸爬滚打多年,终于黄天不负有心人,突破炼器中期——常用控件QWight的属性
开发语言·c++·qt·gui·图形化
冻柠檬飞冰走茶16 小时前
《数据结构实验指导-C++语言版》 求单链表list中的元素个数,即表长
开发语言·数据结构·c++·算法·list
_Narcissus_16 小时前
动态规划初探(含完整代码实现)
c语言·数据结构·c++·算法·动态规划·背包问题·最短路径
法哥201217 小时前
用 C++ 控制 CMW100,到底在干什么?
开发语言·c++
_Narcissus_18 小时前
枚举和模拟算法笔记
c语言·数据结构·c++·笔记·算法·模拟·枚举