从零开始学C++11新标准知识(内含大厂面试题100道)第二期
二、C++内存管理以及和C的小细节
1.C++内存分区(大中小厂面试高频知识点)
学过数据结构以后的对于内存分区的概念就只有“内存四区”。
当然这里的“四区”不是“四驱兄弟”的四个轱辘......不过可以想象成操作系统的四个轮胎,内存就是轮胎里面的空气,有的轮胎是氧气、有的是氢气和二氧化碳、而有的是氮气。
堆:动态申请的内存空间,就是由malloc分配的内存块,由程序员分配和释放,若程序员运行程序结束后,没有释放程序,该分区自动由操作系统回收。
栈:由编译器自动分配释放,存放函数的参数值(形参),
全局/静态变量存储区:顾名思义,这个区存放的是全局变量和静态变量,程序运行结束操作。
代码区:这里存放函数体的二进制代码,操作系统拥有直接管理的权限。
以上四个是所谓的内存四区,还有一个比较重要的点也是重要的面试难点
常量存储区:顾名再思义,存放的是常量,常量是什么?不可以修改的数据,常常就只有一个面孔,经常是一个人,常常不改变的东西。例如const修饰的变量被定义为一个常量,就是将之存储在常量存储区的。
所以,综上!!!当当当!!!铛铛铛!!!!
C++内存分区是其实是分为5个区哦!!!
当然百度百科里是给了4个区,如果回答出最后一种,我想也算是一个加分项,答不出来也没关系,当你打代码的时候,多多思考就好了,这个数据存在哪?怎么用?往哪用?有啥用?一系列的疑惑会让你更加明白数据存在内存的那一块了。
2.C语言和C++内存分配原则
同样我们采用分区的方式进行学习内存分配原则,
C++:
栈区(stack):栈区的执行速度是最快的一个区,采用先进后出的原则。由编译器自动分配并释放,不需要程序员自己操作。
堆区(heap):堆区一般由程序员自己分配或者释放,如果不释放的话,程序结束之后可能会有操作系统回收。但是这里的堆和数据结构中的堆并不是一回事。
全局/静态存储区:内的变量在程序编译阶段已经分配好内存空间并初始化。这块内存在程序的整个运行期间都存在,操作系统
代码区:二进制代码的地盘,操作系统的一本字典。会自己用自己释放等等操作。
常量存储区(次内存区):主要存放程序中的字符串常量,程序结束时有操作系统释放。
C语言和C++在内存方面分配原则基本是一样的处理方法,主要从动态和静态去分析。
1.静态内存分配:编译时分配。包括:全局、静态全局/局部。
2.动态内存分配:运行时分配。包括:
栈(stack): 局部变量。
堆(heap): 在c语言中用到的变量被动态的分配在内存中。(当使用了malloc或calloc、realloc、free等内存分配函数时)
3.细节在哪里?
堆和栈的区别在哪里?
你可以想象一下,一堆苞谷和一栈苞谷的区别,从图形上想象一个有点类似于圆锥,一个是文具盒方方的。
好了,言归正传。
二者申请内存的方式不同:堆分配原则由程序员主动申请去买老哥的。栈是系统动态静态自动分配的。
二者在内存空间存在方式不同:堆是在内存中的空间(由低地址向高地址扩展)不断延续。栈是内存中一段连续的空间(由高地址向低地址延伸),最大容量由系统预定好的。
二者申请内存后系统响应方式不同:申请堆空间的时候,堆在内存中呈现出的方式类似于链表(用来记录空闲地址空间的链表),在链表上寻找第一个大于申请空间的节点分配给程序。将该节点从链表中删除,很多系统这块空间地址的首地址存放的是内存的大小,以便释放,将该快空间上的剩余空间再次链接到空闲的链表上。二栈申请空间的时候,系统自动分配栈空间,如果剩余的空间大于申请空间则成功,否则分配失败,栈会溢出。
二者申请效率不同:栈是自动分配,取决于系统处理的速度,申请效率肯定是比人快的,但是程序员是无法control的,而堆是程序员主动申请的空间,效率虽低,但空间使用起来便于操作,但缺点是容易产生碎片。
二者存放的内容不同:栈存放局部变量,函数的参数。堆中存放的内容是有程序员自己所控制的。
好啦,以上就是今天所学到的第二个C++大厂面试知识点,感兴趣的小伙伴欢迎评论区留言、点赞、转发。
从零开始学C++11新标准知识(内含大厂面试题100道)第二期相关推荐
- 从零开始学前端 - 1. HTML基础知识
作者: 她不美却常驻我心 博客地址: https://blog.csdn.net/qq_39506551 微信公众号:老王的前端分享 每篇文章纯属个人经验观点,如有错误疏漏欢迎指正.转载请附带作者信息 ...
- C++11新标准 default 和 delete的使用
写这个知识点的初衷也是在面试的时候被问到过的,由于对C++11新标准不是很了解,所以你懂得...,好了不多说了 首先我们要了解一下C++类中的四类特殊成员函数:分别是默认构造函数.析构函数.拷贝构造函 ...
- 【C++面试宝典】C++11新特性知识总结
目录 C++11新特性 auto自动类型推导 decltype类型指示符 nullptr常量 lambda表达式(匿名函数) 智能指针 auto_ptr unique_ptr shared_ptr w ...
- 基于c++11新标准开发一个支持多线程高并发的网络库
背景 新的c++11标准出后,c++语法得到了非常多的扩展,比起以往不论什么时候都要灵活和高效,提高了程序编码的效率,为软件开发者节省了不少的时间. 之前我也写过基于ACE的网络server框架,但A ...
- C++11新特性(原封不动转载待查)
C++11标准发布已有一段时间了, 维基百科上有对C++11新标准的变化和C++11新特性介绍的文章. 我是一名C++程序员,非常想了解一下C++11. 英文版的维基百科看起来非常费劲,而中文版维基百 ...
- C++11新特性之新类型与初始化
C++11新特性之新类型与初始化 snoone | 2016-06-23 11:57 浏览量(148) 评论(0) 推荐(0) 数据 这是C++11新特性介绍的第一部分,比较简单易懂, ...
- c++语言自定义操作符,C++11新特性之自定义字面量
1.示例 C++11新标准中引入了用户自定义字面量,也叫自定义后缀操作符,即通过实现一个后缀操作符,将申明了该后缀标识的字面量转化为需要的类型.考察如下代码: long double operator ...
- 【C++11新特性】 nullptr关键字
原创作品,转载请标明:http://blog.csdn.net/Xiejingfa/article/details/50478512 熟悉C++的童鞋都知道,为了避免"野指针"(即 ...
- C++11新特性:using和namespace的特殊用处
using和namespace的特殊用处 零.前言 一.using 1.类型别名 2.别名模板 3.代码示例 二.namespace 1.命名空间 2.命名别名 3.使用示例 零.前言 C++11以后 ...
最新文章
- Android2.2 API 中文文档系列(3) —— AccessibilityService
- git 创建webpack项目_webpack项目的搭建及环境构建
- HbuliderX 历史版本下载
- linux 中文显示乱码解决办法
- 解决微信商户号无法开通企业付款到零钱
- 从URDF到KDL(C++Python)
- 智能优化算法:饥饿游戏搜索算法-附代码
- 2022RWCTF体验赛web的wp
- 聊天室页面问题和解决方案
- EndNote X9插入参考文献的格式
- Layui官网地址官网仓库
- 红绿灯单片机仿真;Keil和Proteus的联合使用仿真;包含免费资源
- Linux虚拟机无法联网问题解决
- Python 必须掌握的知识
- 基于NLP的软件分析和程序漏洞挖掘(二)
- 轮播与fragment联动
- Centos 6.5 x64 安装 虚拟专用网 服务器
- 疫情之下,金三银四的春季招聘还有吗?
- 苹果公布穿戴设备进行跌倒检测专利,Find My技术堪称王炸
- 象棋的ai的视线_隐藏在视线中的“未来”技术:人工智能