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 ...
随机推荐
- run ceph in docker
申明:基本安装是依照http://dockone.io/article/436来进行的,但原文中ceph集群的搭建不够完整.我这里会做一些补充及说明. 1. 下载mon和osd镜像 [root@u ...
- 解决from lxml import etree 导入的时候,显示etree不存在
问题: 当安装完lxml之后,发现使用 from lxml import etree 时,etree不可用 原因 :是lxml中没有etree包 解决: 去官网下载对应包:官网地址:http://l ...
- Unity3d音乐
public AudioClip routineAudio; public AudioClip gameAudio; public AudioClip RewardAudio; publi ...
- C++模板类[初步]
/* * stacktp.h * * Created on: 2014年3月29日 * Author: */ /** * - 模板类的概念,与使用 * -# export template <c ...
- linux shell脚本: 自动监控网站状态并发送提醒邮件
1.创建监控脚本:$ vi /alidata/shell/webcheck.sh #!/bin/sh weblist="/alidata/shell/weblist.txt" my ...
- can not find java.util.map java.lang.Double问题
mybatis @Param注解和ParamType属性不能共存
- 我的Android进阶之旅------>四种呼叫转移场景
运行商为我们提供了如下4中呼叫转移场景: 1.始终进行呼叫转移:不管当前手机处于何种状态,来电都会被转移到指定的电话号码上.在使用这种呼叫转移时应当非常小心,如果启用了这种呼叫转移,你可就永远也接不着 ...
- 学习Filter
http://www.cnblogs.com/jbelial/archive/2012/07/09/2582638.html Filter 介绍: 它主要用于对用户请求进行预处理,也可以对HttpSe ...
- 【学习】Spring 的 AOP :基于Annotation 的“零配置”方式
转自:http://www.cnblogs.com/jbelial/archive/2012/07/20/2539123.html AOP(Aspect Orient Programming ) , ...
- Java多线程系列 JUC线程池06 线程池原理解析(五)
ScheduledThreadPoolExecutor解析 ScheduledThreadPoolExecutor适用于延时执行,或者周期性执行的任务调度,ScheduledThreadPoolExe ...