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 ...
随机推荐
- STM32 Option Bytes位 重置为出厂设置
STM32 Option Bytes位 重置为出厂设置 JLINK 按照说明,在IAR安装目录下找到指定的运行程序JLinkSTM32.exe(D:\Program Files (x86)\IAR S ...
- python爬虫学习研究
目标:做一个小爬虫项目 2017年6月4日13:32:17 mooc网教程Python爬虫入门一之综述要学习Python爬虫,我们要学习的共有以下几点:Python基础知识Python中u ...
- windows监控 排查蓝屏问题
DUMP包分析 工具WinDbg,下载打开,按ctrl+S 输入:SRV*C:\websymbols*http://msdl.microsoft.com/download/symbols:点击OK, ...
- iOS 3DES加密
本文转载至 http://www.cocoachina.com/bbs/read.php?tid=177167 -(NSString *)TripleDES:(NSString *)plainText ...
- json-lib-2.4-jdk15.jar 报错 net.sf.json.JSONException: There is a cycle in the hierarchy!错误解决方案(Hibernate)
使用hibernate容易出现该问题,主要是由于pojo类属性存在级联关系.比如说员工和部门,在员工表里面有部门属性,而在部门表里面有个员工集合,这样就存在了嵌套引用的问题了,就会抛出这个异常. 解决 ...
- Java语言平台
J2SE(Java 2 Platform Standard Edition) 标准版 开发普通桌面和商务应用程序提供的解决方案,该技术体系是下面两者的基础,可以完成一些桌面应用程序的开发 J2ME(J ...
- Bootstrap学习-导航条-分页导航
1.导航条基础 导航条(navbar)和上一节介绍的导航(nav),就相差一个字,多了一个“条”字.其实在Bootstrap框架中他们还是明显的区别.在导航条(navbar)中有一个背景色.而且导航条 ...
- python基础-第九篇-9.2线程与多线程
单线程 import time beginTime = time.time() for a in range(10): print(a) time.sleep(1) shijian = time.ti ...
- ElasticSearch(二十七)type的数据结构
1.什么是type? type,是一个index中用来区分类似的数据的,类似的数据,但是可能有不同的fields,而且有不同的属性来控制索引建立.分词器field的value,在底层的lucene中建 ...
- Jquery实现loading效果
需要引入jquery和bootstrap相关包,然后把下面的代码复制进去就可以了: <div class="modal fade" id="loadingModal ...