zoukankan      html  css  js  c++  java
  • 内存中的栈与堆与静态存储区与代码区

    一个程序,是存在硬盘上的。当你运行它时,需要将它拷贝入内存中才能运行。在内存中分别存放在栈区,堆区,静态存储区,代码区。

    首先着重说明,不存在常量区(它在静态存储区内)或是文字常量区(Java或许有),或是自由存储区(存在但是是抽象的)。

    1.栈区存放存放函数的参数值,局部变量的值等,它处于内存中的高地址范围,每存入一个变量,就好似向栈中压入一个变量一样,即高地址向低地址生长。它的资源由编译器分配与释放,由于它在内存中是连续的,所以存释效率高
    2.堆区存放类成员变量,所有类的实例和数组都是在堆上分配内存的,关键在于存放的是需要程序员手动分配与释放的变量(python做了优化),通过malloc/free或者new/delete(C++)。这里后者其实存储在的是自由存储区,但free store是个抽象概念将其归入堆中不全对但也无大错。堆区位于内存中的低地址区范围,像链表一样存入一个个malloc或者new的对象,即低地址向高地址生长,由于它在内存中可以不是连续的,所以存释效率低
    3.静态存储区存放静态变量、全局变量与常量,它在内存中的位置位于堆下面。在C中静态存储区还分为初始化的和未初始化的区分别存放相应的变量(当然常量存放在初始化的区了)。在C++中没这种区分,直接就都存了。C++中这个区甚至可以存new出来的对象,所以说new出来的对象存在了自由存储区(自由嘛,自由选择存的位置)。new是通过重载构造函数来实现自由选择的。这也是和malloc的一个大区别之一,malloc不能重载。静态存储区中存放的数据初始化后将伴随程序走到最后,举个例子

    #include <iostream>
    
    using std::cout;
    using std::endl;
    int global = 1; //全局变量
    static int sg = 2; // 静态全局变量
    void func()
    {
    	static int funs = 3; //静态局部变量
    	cout << funs << endl;
    	funs++;
    }
    int main()
    {
    	cout << global<<endl; //1
    	cout << sg << endl; //2
    	func(); //3
    	func(); //4
    }
    

    4.代码区就是存放你的程序的编译后的可执行代码的地方了,CPU执行的机器指令,并且是只读的。存放代码,不允许修改,但可以执行。

  • 相关阅读:
    Difference between 2>&-, 2>/dev/null, |&, &>/dev/null and >/dev/null 2>&1
    (OK)(OK) docker-(centos-quagga-ospf-mdr)--NS3--MANET
    How to Interactively Create a Docker Container
    (OK)(www.nrl.navy.mil) OSPF MANET Designated Routers (OSPF-MDR) Implementation
    docker-batman
    (OK)(OK) NS3
    quagga-mtr——Multi-Topology Routing support for quagga routing suite
    (OK)(OK) seem-tools-CLI-manual.sh
    (OK)(OK) seem-tools-CLI-semi-auto.sh
    (OK)(OK) manet-seem-template.cc
  • 原文地址:https://www.cnblogs.com/chenwenyin/p/12470683.html
Copyright © 2011-2022 走看看