`

程序的内存空间分配

    博客分类:
  • C++
阅读更多
在计算机领域,堆栈是一个不容忽视的概念,但是很多人甚至是计算机专业的人也没有明确堆栈其实是两种数据结构。

要点:

堆:顺序随意

栈:先进后出

堆和栈的区别

一、预备知识—程序的内存分配

一个由c/C++编译的程序占用的内存分为以下几个部分

1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。

2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。

3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后有系统释放

4、文字常量区 —常量字符串就是放在这里的。 程序结束后由系统释放

5、程序代码区—存放函数体的二进制代码
各种变量的作用域:

局部静态变量。在局部变量之前加上关键字static,局部变量就被定义成为一个局部静态变量。
内存中的位置:静态存储区。
初始化:未经初始化的全局静态变量会被程序自动初始化为0(自动对象的值是任意的,除非被显式初始化)。
作用域:作用域指变量的有效范围,当定义它的函数或者语句块结束时,作用域随之结束。
注意:当static 用来修饰局部变量时,它就改变了局部变量的存储位置,从原来的栈中存放改为静态存储区。但是局部静态变量在离开作用域之后,并没有被销毁,而是仍然驻留在内存中,直到程序结束,只不过不能再对它进行操作了

全局静态变量。在全局变量之前加上关键字static,全局变量就被定义成为一个全局静态变量。
内存中的位置:静态存储区(静态存储区在整个程序运行期间都存在)。
初始化:未经初始化的全局静态变量会被程序自动初始化为0(自动对象的值是任意的,除非被显式初始化)。
作用域:全局静态变量在声明它的文件之外是不可见的,准确地讲,是从定义处开始到文件结尾。
注意:当static 用来修饰全局变量时,它就改变了全局变量的作用域(在声明它的文件之外是不可见的),但是没有改变它的存放位置,还是在静态存储区。

静态函数。在函数的返回类型前加上关键字static,该函数就被定义成为静态函数。
函数的定义和声明默认情况下是 extern 的,但静态函数只在声明它的文件中可见,不能被其他文件所用。

静态数据成员。
内存中的位置:静态存储区。
初始化和定义:
静态数据成员定义时要分配空间,不能在类声明中定义。
静态数据成员在程序中只能提供一个定义。静态数据成员的初始化不能在类的头文件中。
访问:
类实例名.静态数据成员
类类型名::静态数据成员
说明:
static 数据成员和普通数据成员一样遵循public,protected,private 访问规则。
对于非静态数据成员,每个类实例都有自己的备份。静态数据成员被当做类的全局对象,无论这个类的对象被定义了多少个,静态数据成员在程序中也只有一个备份,由该类类型的所有对象共享访问。
同全局对象相比,使用静态数据成员有两个优势:
静态数据成员没有进入程序的全局名字空间,因此不存在与程序中其他全局名字冲突的可能性。
静态数据成员可以实现信息隐藏。静态成员可以是 private 成员,而全局对象不可以。
静态数据成员的唯一性本质(独立于类的任何对象而存在的唯一实例),使它能够以独特的方式被使用,这些方式对于非static数据成员来说是非法的。

静态成员函数。在类的成员函数返回值之前加上关键字static,它就被声明为一个静态成员函数。静态成员函数不能声明为const 或volatile,这与非静态成员函数不同。
定义:出现在类体外的函数定义不能指定关键字static。
作用域:主要用于对静态数据成员的操作。
静态成员函数与类相联系,不与类的对象相联系。
静态成员函数不能访问非静态数据成员,因为非静态数据成员属于特定的类实例。
静态成员函数没有this指针,因此在静态成员函数中隐式或显式地引用这个指针都将导致编译时刻错误。试图访问隐式引用this指针的非静态数据成员也会导致编译时刻错误。

访问:可以用成员访问操作符(.)和箭头(->)为一个类实例或指向类实例的指针调用静态成
员函数,也可以用限定修饰符名直接访问或调用静态成员函数,而无需声明类实例
分享到:
评论

相关推荐

    JVM内存空间分配笔记

    ### JVM内存空间分配详解 #### 一、JVM内存模型概览 JVM(Java虚拟机)内存模型主要由以下几个部分组成:程序计数器、Java虚拟机栈、本地方法栈、Java堆以及方法区(在JDK 8之后称为元空间)。下面将对这几个部分...

    用new和delete运算符动态分配内存空间的方法编写程序。

    用new和delete运算符动态分配内存空间的方法编写程序。从键盘输入33整型数组的数据,并计算出所有元素之和,打印出最大值和最小值。输入输出要用流运算符实现。

    操作系统实验——磁盘存储空间的分配和回收

    (1) 为了提高磁盘存储空间的利用率,可在磁盘上组织成链接文件、索引文件,这类文件可以把逻辑记录存放在不连续的存储空间。为了表示哪些磁盘空间已被占用,哪些磁盘空间是空闲的,可用位示图来指出。位示图由若干...

    8086系统存储空间分配

    8086 系统的存储空间分配以及与输入输出相关的硬件和软件设计。8086 是一种16位微处理器,其存储空间的组织和分配对于理解系统的运作至关重要。 1. **8086 系统存储空间分配** 在8086处理器中,整个内存空间被分为...

    程序的内存分配

    ### 程序的内存分配 #### 概述 本文主要探讨了程序如何在多任务操作系统环境中使用内存,重点分析了内存的分配机制及其管理方式。内存管理是操作系统中的核心功能之一,对于开发者和系统管理员而言,理解内存管理...

    动态内存分配到底为谁分配内存空间

    该函数用于在程序运行时动态地分配一定大小的内存空间。例如,如果需要分配一个整型变量的空间,可以使用如下代码: ```c int *p = (int *)malloc(sizeof(int)); ``` 一旦不再需要这块内存,应通过`free()`函数将...

    可变分区存储管理方式的内存分配和回收

    可变分区存储管理提供了一种灵活的方式来分配内存资源,使得不同大小的程序都能够得到适当的内存支持。通过对空闲分区的有效管理和合理的调度算法选择,可以最大化内存的利用率,减少内存碎片的问题。同时,这种机制...

    内存分配模拟程序-OS

    - **内存**:计算机的临时数据存储区域,分为物理内存(RAM)和虚拟内存(硬盘上的空间用于扩展内存)。 - **进程**:操作系统中执行的程序实例,每个进程都有自己的内存空间。 - **地址空间**:每个进程都有一个...

    java程序中的内存分配问题

    Java程序在运行时的内存分配是一个关键的概念,它关乎到程序的性能、稳定性和资源管理。这个主题主要涉及以下几个方面: 1. **JVM内存结构**:Java虚拟机(JVM)将内存划分为几个区域,包括堆(Heap)、栈(Stack)...

    C++程序内存分配讲解

    1、问:程序运行需要哪些空间?答:栈区、堆区、常量区等。 2、问:动态空间如何使用?答:通过指针 3、问:常量一定是在常量区吗?答:不一定 4、问:宏定义的常量是怎么回事?答:宏代换 5、问:字符串常量的存储...

    易语言分配可用内存空间

    内存分配的主要目的是为变量、数据结构或动态数组等创建存储空间。在易语言中,常用的内存分配命令有“分配内存”和“重新分配内存”。 1. **分配内存**:这个命令用于向系统申请一段连续的内存空间。例如,如果...

    存储空间分配.zip

    首先,存储空间分配的基本概念是操作系统如何为文件和应用程序分配磁盘空间。主要有以下几种方法: 1. **连续分配**:这是最早的空间分配方式,文件占用磁盘上的连续块。优点是读写速度快,但容易产生碎片,且大...

    C/C 程序的内存分配

    #### C/C++ 程序内存划分 C/C++程序的内存可以大致分为以下几部分: 1. **栈区(stack)**:主要由编译器自动分配和释放。用于存储函数的参数值、局部变量等。栈的操作方式类似于数据结构中的栈,即后进先出(LIFO)...

    操作系统算法 空间分配

    本程序提供了一个简单的内存空间分配示例,涉及到了数据结构的设计、链表的操作以及内存分配的基本逻辑。通过上述分析,我们可以学到以下几点: 1. **数据结构的选择**:使用双向链表作为内存管理的基础数据结构。 ...

    实现动态分区分配模拟程序

    编写一个动态分区分配算法模拟程序,加深对动态分区存储管理方式及其实现过程的理解。 要求: 1.空闲分区通过空闲区链进行管理,在内存分配时,优先考虑低地址部分的空闲区。 2.分别采用首次适应算法、最佳适应算法...

    主存储器空间的分配和回收

    在计算机科学领域,主存储器(也称为主存或RAM)是计算机系统中临时存储程序和数据的关键组件。主存储器的管理和优化对于系统的性能至关重要。在这个“主存储器空间的分配和回收”实验中,我们将关注如何有效地利用...

    C语言实现 + 存储管理实验 + CPP源程序 + 实现页表的数据结构、分页式内存空间的分配及回收(建议采用位图法)页面置换算法

    要求实现:页表的数据结构、分页式内存空间的分配及回收(建议采用位图法)、地址重定位、页面置换算法(从FIFO,LRU,NRU中任选一种)。 提示:可先用动态申请的方式申请一大块空间,然后假设该空间为内存区域,对该...

    实验二 实现动态分区分配模拟程序

    编写一个动态分区分配算法模拟程序,加深对动态分区存储管理方式及其实现过程的理解。 要求: 1.空闲分区通过空闲区链进行管理,在内存分配时,优先考虑低地址部分的空闲区。 2.分别采用首次适应算法、最佳适应算法...

    操作系统设计 内存分配模拟(C++版)

    内存分配模拟器旨在通过程序模拟这些过程,帮助开发者理解和学习操作系统的工作机制。 C++作为一种强大的面向对象编程语言,提供了丰富的库支持和底层控制能力,非常适合用于构建这样的模拟器。MFC(Microsoft ...

Global site tag (gtag.js) - Google Analytics