C++内存分区

C++的内存划分为栈区、堆区、全局区/静态区、字符串常量和代码区。

这里去掉自由存储区,增加了代码区,理由会在下面讲到。

栈区:由系统进行内存的管理。

说明:主要存放函数的参数以及局部变量。栈区由系统进行内存管理,在函数完成执行,系统自行释放栈区内存,不需要用户管理。整个程序的栈区的大小可以在编译器中由用户自行设定,默认的栈区大小为3M。

全局/静态区:全局、静态数据存放在一起的,初始化的全局变量和静态变量是在一起的。未初始化的全局变量和静态变量是在相邻的空间中。

说明:全局变量和静态全局变量的存储方式是一致的,但是其区别在于,全局变量在整个源代码中都可以使用,而静态全局变量只能在当前文件中有效。比如我们的一个程序有5个文件,那么某个文件中申请了静态全局变量,这个静态全局变量只能在当前文件中使用,其他四个文件均不可以使用。而某个文件中申请了全局变量,那么其他四个文件中都可以使用该全局变量(只需要通过关键字extern申明一下就可以使用了)。事实上static改变了变量的作用范围。

字符串常量区:存放字符串常量,程序结束后,由系统进行释放。比如我们定义char * p = “Hello World”; 这里的“Hello World”就是在字符串常量中,最终系统会自动释放。

代码区:存放程序体的二进制代码。比如我们写的函数,都是在代码区的。

堆区:由用户手动申请,手动释放。在C中使用malloc,在C++中使用new(当然C++中也可以使用malloc)。

说明:new操作符本质上还是使用了malloc进行内存的申请,因此我将自由存储区和堆区都说成堆区,不过两者还是有很大的差别。

1)malloc是C语言中的函数,而new是C++中的操作符。

2)malloc申请之后返回的类型是VOID*,而new返回的指针带有类型。

3)malloc只负责内存的分配而不会调用类的构造函数,而new不仅会分配内存,而且会自动调用类的构造函数。

时间: 2024-10-10 10:26:57

C++内存分区的相关文章

iOS 中内存分区

1  关于RAM ROM 我们知道,内存为RAM类型不具备掉电存储能力(即一掉电数据全没了),所以app程序一般存放于内存卡(Flash)或ROM中.RAM的访问速度要远高内存卡(Flash)或ROM. 2  当启动一个app 为了加快程序执行速度,系统会把开启的那个app程序从Flash或ROM里面拷贝到内存(RAM),然后从内存里面执行代码.另一个原因是CPU不能直接从内存卡里面读取指令(需要Flash驱动等等). 3  内存分区:可以分为5个区 1).栈区(stack)— 这个一般由编译器

c语言学习之基础知识点介绍(十八):几个修饰关键字和内存分区

一.几个修饰关键字 全局变量: 全局变量跟函数一样也分为声明和实现.如果是全局变量,实现在它调用之后,那么需要在调用之前进行声明.注意:全局变量的声明只能写在函数外,写在函数就不是全局变量了而是局部变量. static: 修饰局部变量:      可以把局部变量变为静态变量.意思就是:程序一启动就加载,程序退出才会回收空间(跟全局变量很像) .   静态变量:用static修饰的局部变量就叫静态变量. 修饰全局变量:            让全局变量只能在本模块中访问.     修饰函数:   

C++:程序分段与内存分区

1. 进程分段 bss段(bss segment):存放未初始化(或者说是zero-initialization,详见C/C++对象初始化相关)的全局对象,属于静态内存分配.(bss全称为"Block Started by Symbol") data段(data segment):存放已经初始化的全局对象,属于静态内存分配. 栈(stack):存放函数内创建的局部对象(static对象属于全局对象),主要属于静态内存分配,C的alloca函数也用于支持动态内存分配. 堆(heap):存

C++:内存分区

前言:最近正在学习有关static的知识,发觉对C++的内存分区不是很了解,上网查了很多资料,遂将这几天的学习笔记进行了简单整理,发表在这里 ? 栈区(stack):主要用来存放函数的参数以及局部变量.栈区由系统进行内存管理,在函数完成执行时,系统会自行释放栈区的内存,而不需要用户参与管理.整个程序的栈区的大小可以在编译器中由用户自行设定,默认的栈区大小为3M ? 堆区(heap):由用户手动申请,手动释放.如果用户忘记对其所申请的内存资源进行释放,该内存资源可能会在程序结束时由操作系统(OS)

jvm性能优化及内存分区

jvm性能优化及内存分区 2012-09-17 15:51:37 分类: Java Some of the default values for Sun JVMs are listed below. JDK 1.3.1_06 Initial Size Maximum Size Client JVM 1MB 32MB Server JVM 1MB 64MB JDK 1.4.1_01 Initial Size Maximum Size Client JVM 4MB 64MB Server JVM 4

JVM的内存分区

JVM的内存分区 这篇文章尝试讨论清楚JVM的内存分区情况. 1.       JVM的内存和系统内存的关系 下图是对系统内存及JVM内存的大致描绘 对大多数操作系统,内存可以分为物理内存RAM及Swap(交换区)两大部分,Swap Space在物理上是一块独立的磁盘区域,当操作系统发现内存不够使用时,便开始使用交换区. 在系统层面,Linux系统的内存大致可以划分为: BIN,内核引导内存 Kernel Space(内核内存),操作系统进行程序调度,内存分配,硬件资源管理等动作需要的内存 Us

程序中五大内存分区

本文介绍C/C++中堆,栈及静态数据区. 五大内存分区 在C++中,内存分成5个区,他们分别是堆.栈.自由存储区.全局/静态存储区和常量存储区.下面分别来介绍: 栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清除的变量的存储区.里面的变量通常是局部变量.函数参数等. 堆,就是那些由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete.如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收. 自由存储区,就是那些由malloc等分

C/C++中的内存分区

五大内存分区 在C++中,内存分成5个区,它们分别是:栈.堆.自由存储区.全局/静态存储区和常量存储区. 栈:由编译器自动分配和释放,存放函数的参数值.局部变量的值等.操作方式类似于数据结构中的栈. 堆:堆由程序员手动分配和释放,且完全不同于数据结构中的堆,分配方式类似链表.由new/delete 申请和释放.若程序员忘记释放则由系统于程序结束时回收. 自由存储区:是由malloc等分配的内存块,和堆十分相似,不过是用free来释放. 全局/静态存储区:存放全局变量和静态变量.在C中,全局变量又

Java 虚拟机: JVM内存分区及其用途

Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区,这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有些区域则依赖用户线程的启动和结束而建立和销毁. Java虚拟机所管理的内存将会包括以下几个运行时数据区域: 1.程序计数器 2.Java虚拟机栈 3.本地方法栈 4.Java堆 5.方法区 下面分别介绍各个内存分区及它们的作用: 1.程序计数器 (PC)程序计数器是一块较小的内存分区,你可以把它看做当前线程所执行的字节码的指示器.

Cocoa框架中的内存分区

NSObject对象类实例为我们提供了两种分配内存的方式:alloc和allocWithZone:.alloc的实现也是为了调用allocWitZone:,它传入了一个默认的zone.所以明确的说,NSObject提供了一种分配内存的方式.什么是zone?为什么要使用zone? Zone代表了内存中的一段连续的内存区域.当我们需要创建一些具有相同访问模式以及生命周期的对象时,我们可以采用Zone让这些对象在计算机的地址空间中保持相邻的位置,这样可以提高应用程序的性能.要搞清楚对象在内存中的位置如