实验方式:尝试以不同方式创建超大号二维数组

测试代码:

#include <iostream>
using namespace std;
const int maxn=1000000;
class C{
int arr[maxn];
};
//int a[maxn]; 全局大数组
//C a; 含大数组的全局对象
int main(){
//int a[maxn]; 局部大数组
//C a; 含大数组的局部对象
//C a=*new C; 通过new创建的含大数组的对象
//C* a=new C; 通过new创建的指向含大数组的对象的指针
cout<<"hello";
return 0;
}

结果:

全局大数组:正常

含大数组的全局对象:正常

局部大数组:段错误

含大数组的局部对象:段错误

通过new创建的含大数组的对象 :段错误

通过new创建的指向含大数组的对象的指针 :正常

分析:C++中可能存在像java一样的堆栈内存机制,对于不同作用域的变量有不同内存管理策略

知识导入:

这篇文章讲的真是太好了:

关于堆栈的讲解(我见过的最经典的)

1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。

2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。

3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后有系统释放

4、文字常量区—常量字符串就是放在这里的。 程序结束后由系统释放

5、程序代码区—存放函数体的二进制代码。

在WINDOWS下,栈的大小是2M或4M

变量类型+变量名出来的变量都在栈里,new出来的内存都在堆里,全局变量有自己的地儿。栈内存有限,少在栈上开大数组。

达成成就:

Stack Overflow


原写于2019年05月31日 21:38:43

2020.7.13更新

过去这一年我学了汇编语言、操作系统,又读完了《CSAPP》,对内存布局又有了新的理解。对于一个程序来说,它的内存布局可以概括为一张图:

逐个解释一下:

  • 内核内存:操作系统内核的代码和数据,无法直接访问这块内存。注意使用各种操作系统提供的函数直接不是访问操作系统的代码,而是通过“中断机制”将控制权暂时交给了操作系统,再由操作系统执行对应的例程,执行完毕后再将控制权交还给用户程序。
  • 用户栈:存放了函数内定义的临时变量,传给函数的参数,以及函数的调用栈。所谓的函数的调用栈,上个图就是:

在这幅图里main调用了solve调用了dfs,这一层层嵌套的信息就储存在用户栈中。我们常讲的栈溢出、爆栈、stack over flow指的就是临时变量占内存太多或函数嵌套调用过多,同时用户栈的内存空间又太小,导致了内存溢出。

  • 共享库的内存映射区域:我们以快速排序函数qsort()为例,如果每个要用qsort的用户程序都在自己的代码里嵌入qsort的代码就造成了重复,是一种浪费行为。为了节省空间操作系统只在内存中存放一份qsort的代码,对于每个需要调用qsort的程序,都在他们的内存布局里添加一个对应的“映射”,类似于只添加了一个快捷方式,并不占用实际空间。
  • 运行时堆:所有通过malloc()函数、new关键字等等方式动态分配的内存都在这一区域。
  • 读写段:包括了可读可写的全局变量和用static定义的变量,其中.data指初始化完成的,.bss指初始化未完成的
  • 只读代码段:.init指操作系统初始化程序时用到的一段小函数,.text指程序的代码,只能读不能修改,.rodata指程序中定义的各种常量,典型的如提前定义好的字符串常量。

引申阅读:内存中的堆和栈到底是什么 - 简书

参考内容:《深入理解计算机系统 第三版》链接器相关章节

C++ 栈内存与堆内存小探究的更多相关文章

  1. JavaScript 数据结构与算法之美 - 栈内存与堆内存 、浅拷贝与深拷贝

    前言 想写好前端,先练好内功. 栈内存与堆内存 .浅拷贝与深拷贝,可以说是前端程序员的内功,要知其然,知其所以然. 笔者写的 JavaScript 数据结构与算法之美 系列用的语言是 JavaScri ...

  2. java中栈内存与堆内存(JVM内存模型)

    java中栈内存与堆内存(JVM内存模型) Java中堆内存和栈内存详解1 和 Java中堆内存和栈内存详解2 都粗略讲解了栈内存和堆内存的区别,以及代码中哪些变量存储在堆中.哪些存储在栈中.内存中的 ...

  3. js的栈内存和堆内存

    栈内存和堆内存在了解一门语言底层数据结构上,挺重要的,做了个总结 JS中的栈内存堆内存 JS的内存空间分为栈(stack).堆(heap).池(一般也会归类为栈中). 其中栈存放变量,堆存放复杂对象, ...

  4. JavaScript变量——栈内存or堆内存

    原文  http://blog.csdn.net/xdd19910505/article/details/41900693 堆和栈这两个字我们已经接触多很多次,那么具体是什么存在栈中什么存在堆中呢?就 ...

  5. 牛客网Java刷题知识点之内存的划分(寄存器、本地方法区、方法区、栈内存和堆内存)

    不多说,直接上干货!  其中        1)程序计数器:用于指示当前线程所执行的字节码执行到了第几行,可以理解为当前线程的行号指示器.每个计数器志勇赖记录一个线程的行号,所以它是线程私有的.    ...

  6. JVM存储位置分配——java中局部变量、实例变量和静态变量在方法区、栈内存、堆内存中的分配

    Java中的变量根据不同的标准可以分为两类,以其引用的数据类型的不同来划分可分为“原始数据类型变量和引用数据类型变量”,以其作用范围的不同来区分可分为“局部变量,实例变量和静态变量”. 根据“Java ...

  7. JS栈内存与堆内存

    ㈠JavaScript变量 ⒈分类 ⑴JavaScript中的变量分为基本类型和引用类型. ⑵基本类型就是保存在栈内存中的简单数据段. ⑶引用类型指的是那些保存在堆内存中的对象. ⒉基本类型  基本类 ...

  8. Java中局部变量、实例变量和静态变量在方法区、栈内存、堆内存中的分配

    转自:https://blog.csdn.net/leunging/article/details/80599282 感谢CSDN博主「leunging」的总结分享 ———————————————— ...

  9. (转)java内存分配分析/栈内存、堆内存

    转自(http://blog.csdn.net/qh_java/article/details/9084091) java内存分配分析/栈内存.堆内存 java内存分配分析 本文将由浅入深详细介绍Ja ...

  10. 目录_Java内存分配(直接内存、堆内存、Unsafel类、内存映射文件)

    1.Java直接内存与堆内存-MarchOn 2.Java内存映射文件-MarchOn 3.Java Unsafe的使用-MarchOn 简单总结: 1.内存映射文件 读文件时候一般要两次复制:从磁盘 ...

随机推荐

  1. Mybatis 是否支持延迟加载?如果支持,它的实现原理是什么?

    Mybatis 仅支持 association 关联对象和 collection 关联集合对象的延迟加载,association 指的就是一对一,collection 指的就是一对多查询.在 Myba ...

  2. 您对 Mike Cohn 的测试金字塔了解多少?

    Mike Cohn 提供了一个名为 Test Pyramid 的模型.这描述了软件开发所需的自 动化测试类型. 根据金字塔,第一层的测试数量应该最高.在服务层,测试次数应小于单元测试 级别,但应大于端 ...

  3. isNotEmpty 与 isNotBlank 的区别

    isNotEmpty(str)等价于 str != null && str.length > 0 isNotBlank(str) 等价于 str != null &&am ...

  4. vulnhub 靶机 Kioptrix Level 1渗透笔记

    靶机下载地址:https://www.vulnhub.com/entry/kioptrix-level-1-1,22/ kali ip 信息收集 先使用nmap收集目标的ip地址 nmap -sP 1 ...

  5. 小程序开发之一(使用fly进行http封装)

    原文地址:http://callmesoul.cn 下载fly js文件 fly小程序文档 /api/config.js 配置,主要配置全局的host url和request拦截和request拦截 ...

  6. 移动端H5页面中1px边框的几种解决方法

    问题提出 这是一个比较老的问题了,我第一次注意到的时候,是UI设计师来找我麻烦,emmm那时候我才初入前端职场,啥也不懂啊啊啊啊啊,情形是这样的:设计师拿着手机过来:这些边框都粗了啊,我的设计稿上是1 ...

  7. spark-shell报错java.lang.IllegalArgumentException: java.net.UnknownHostException: namenode

    在使用spark on yarn启动spark-shell时,发现报错: 是说找不到主机名为namenode的主机,那么应该是配置文件出错了. 经过检查,发现是spark-defaults.conf文 ...

  8. c++实现状态模式

    实验:用Java代码模拟实现课堂上的"银行账户"的实例,要求编写客户端测试代码模拟用户存款和取款,注意账户对象状态和行为的变化. 由于是c++,不像java那么灵活,所以类的调用方 ...

  9. Python使用函数实现杨辉三角

    运行效果: 可在函数中指定阶层数,输出对应的杨辉三角 源代码如下: 1 # -*-coding:utf-8 -*- 2 ''' 3 chapter4_do.py 4 函数yanghui(n)用于输出n ...

  10. css3种不知道宽高的情况下水平垂直居中的方法

    第一种:display:table-cell 组合使用display:table-cell和vertical-align.text-align,使父元素内的所有行内元素水平垂直居中(内部div设置di ...