C++内存使用机制基本概念详解
.程序使用内存区 一个程序占用的内存区一般分为5种: ()全局、静态数据区:存储全局变量及静态变量(包括全局静态变量和局部静态变量) ()常量数据区:存储程序中的常量字符串等。 ()代码区:存储程序的代码。 ()栈:存储自动变量或者局部变量,以及传递的函数参数等。 ()堆:存储动态产生的数据。 在处理内存时,系统会自动将内存对齐,这样虽然会浪费一些内存,但由于CPU在对齐方式下运行比较快,所以一般都是对程序性能还是有好处的。 一个程序使用的栈的大小是固定的,由编译器决定。一般是1MB。栈的内存是系统自动分配的,压栈和出栈都有相应的指令进行操作。因此效率较高,并且分配的内存空间是连续的,不会产生内存碎片;而堆上的内存是由开发人员来动态分配和回收的。在分配内存时,系统需要按照一定的算法在堆空间中寻找合适大小的空闲堆,并修改相应的维护堆空闲空间的链表,然后返回地址给程序。因此效率比栈要低,此外还容易产生内存碎片。 从C++对象模型的角度来说,对象就是C++内存使用机制中的一片区域。如果一个对象通过定义在某个函数内的变量或者实现需要的临时变量来创建时,它是栈上的一个对象;如果一个对象是定义在全局范围内的变量,则它是存储全局/静态数据区;如果一个对象是通过new操作符来创建时,它是堆上的一个对象。 .对象的生命周期 ()通过定义变量创建对象:在这种情况下,变量的作用域决定了对象的生命周期。当进入变量的作用域时,对象被创建。而退出变量的作用域时,对象被销毁。值得注意的是静态变量和全局变量,由于全局变量的作用域是整个程序,因此被声明为全局变量的对象在程序调用main()函数之前被创建。当程序退出main()函数之后,全局对象才被销毁。静态对象与全局对象类似,虽然静态变量的作用域不是整个程序,但静态变量是存储在全局/静态数据区中,在程序开始时已经分配好。因此声明为静态变量的对象第一次进入作用域时被创建,直到程序退出时被销毁。 ()通过new操作符创建对象:这种情况相对比较简单,但也最容易造成内存泄漏。通过new创建的对象会一直存在,直到被delete销毁。即使指向该对象的指针(一般都是自动变量)已被销毁,但还没有调用delete,该对象就会一直存在。即占据内存空间,直到程序退出,因此也就造成内存泄漏。 ()通过实现创建对象:这种情况一般是指一些隐藏的中间临时变量的创建和销毁。它们的生命周期很短,也不容易被开发人员发觉。但常常是造成程序性能下降的瓶颈,尤其是对于那些占用内存较多,创建速度较慢的对象。这些临时对象一般是通过copy constructor创建的。在实际开发中,通过值传递传递参数,重载+及++等操作符,对对象进行算术运算时,也会有临时对象,对于这些情况,都要尽量避免不必要的临时对象的出现。 .C++对象的内存布局 ()非静态数据成员是影响对象占据内存大小的主要因素,随着对象数目的增加,非静态数据成员占据的内存会相应增加。 ()所有的对象共享一份静态数据成员,所以静态数据成员占据的内存的数量不会随着对象数目的增加而增加。 ()静态成员函数和非静态成员函数不会影响对象内存的大小,虽然其实现会占据相应的C++内存使用机制空间,同样也不会随着对象数目的增加而增加。 ()如果对象中包含虚函数,会增加4个字节的空间(虚函数表指针),不论有多少个虚函数。
C++内存使用机制基本概念详解的更多相关文章
- 大数据学习笔记——Spark工作机制以及API详解
Spark工作机制以及API详解 本篇文章将会承接上篇关于如何部署Spark分布式集群的博客,会先对RDD编程中常见的API进行一个整理,接着再结合源代码以及注释详细地解读spark的作业提交流程,调 ...
- [转载]windows任务管理器中的工作设置内存,内存专用工作集,提交大小详解
windows任务管理器中的工作设置内存,内存专用工作集,提交大小详解 http://shashanzhao.com/archives/832.html 虽然是中文字,但是理解起来还是很困难,什么叫工 ...
- c++中内存拷贝函数(C++ memcpy)详解
原型:void*memcpy(void*dest, const void*src,unsigned int count); 功能:由src所指内存区域复制count个字节到dest所指内存区域. 说明 ...
- JWT基础概念详解
JWT基础概念详解 JWT介绍 之前我们文章讲过分布式session如何存储,其中就讲到过Token.JWT.首先,我们来回顾一下使用Token进行身份认证. 客户端发送登录请求到服务器 服务器在用户 ...
- java入门---对象和类&概念详解&实例
Java作为一种面向对象语言.支持以下基本概念: 多态 继承 封装 抽象 类 对象 实例 方法 重载 这篇文章,我们主要来看下: 对象:对象是类的一个实例(对象不是找个女朋友),有状态 ...
- Storm 学习之路(二)—— Storm核心概念详解
一.Storm核心概念 1.1 Topologies(拓扑) 一个完整的Storm流处理程序被称为Storm topology(拓扑).它是一个是由Spouts 和Bolts通过Stream连接起来的 ...
- Storm 系列(二)—— Storm 核心概念详解
一.Storm核心概念 1.1 Topologies(拓扑) 一个完整的 Storm 流处理程序被称为 Storm topology(拓扑).它是一个是由 Spouts 和 Bolts 通过 Stre ...
- Android多线程----异步消息处理机制之Handler详解
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/ ...
- android Handler机制之ThreadLocal详解
概述 我们在谈Handler机制的时候,其实也就是谈Handler.Message.Looper.MessageQueue之间的关系,对于其工作原理我们不做详解(Handler机制详解). Messa ...
随机推荐
- jQuery效果之显示与隐藏
.hide([duration][,complete])--目标元素的隐藏. .show([duration][,complete])--目标元素的显示: .toggle([duration][,co ...
- table中tr的display属性在火狐中显示不正常,IE中显示正常
最近在作项目的时候碰到一个问题,就是需要AJAX来交互显示<tr> </tr> 标签内的东西,按照常理,对于某一单元行需要显示时,使用:display:block属性,不需要显 ...
- P1009 阶乘之和
P1009 阶乘之和 题目提供者洛谷OnlineJudge 标签数论(数学相关)高精1998NOIp提高组NOIp普及组 难度普及- 通过/提交1139/3791 提交该题 讨论 题解 记录 题目描述 ...
- 九度OJ 1324:The Best Rank(最优排名) (排序)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:489 解决:126 题目描述: To evaluate the performance of our first year CS major ...
- 5.设计模式----prototype原型模式
原型模式:做到是原型,那肯定是自己本身才是原型,原型模式属于对象的创建模式. 关于原型模式的实现方式分2种: (1)简单形式.(2)登记形式,这两种表现形式仅仅是原型模式的不同实现. package ...
- Android笔记之使用ZXing扫描二维码
ZXing发布版下载地址:https://github.com/zxing/zxing/releases 为了能让官方Demo跑起来,先把ZXing核心部分core复制到自己的工程里 还要把andro ...
- 我的Android进阶之旅------>Android SDK支持的配置标识符(有用的参考文件)
Android SDK支持的配置标致符 配置标识符 标识符值 描 述 MCC MNC 例子: mcc310: MCC310-MNC004: MCC208-MNC00 MCC(移动国家代码 ...
- Java语言实现简单FTP软件------>源码放送(十三)
Java语言实现简单FTP软件------>FTP协议分析(一) Java语言实现简单FTP软件------>FTP软件效果图预览之下载功能(二) Java语言实现简单FTP软件----- ...
- iOS 字符串截取,将字符串中用括号包含的内容去除
//去除字符串中用括号括住的位置 -(NSString *)handleStringWithString:(NSString *)str{ NSMutableString * muStr = [NSM ...
- Java并发之ArrayBlockingQueue
ArrayBlockingQueue是一个由数组支持的有界阻塞队列.此队列按 FIFO(先进先出)原则对元素进行排序.队列的头部是在队列中存在时间最长的元素.队列的尾部是在队列中存在时间最短的元素.新 ...