首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

内存四之代码,全局,栈

C++ 在程序执行时,将内存大致分为代码,全局,栈四个区域。不同的区域存储不同的数据,赋予不同的生命周期,能够更灵活地进行编程。...,存放函数的参数值以及局部变量等; :一般由程序员通过 new 开辟空间,进行分配和释放,若程序员不释放,则程序结束时由操作系统回收 下面通过一个例子对全局,栈的数据声明周期进行说明: /...<< "s_a 的地址为:\t" << int(&s_a) << endl; cout << "s_b 的地址为:\t" << int(&s_b) << endl; // 程序员自己创建变量,属于...同理,a,b 都属于栈,d_a,d_b 都属于。...相反,数据由程序员自己进行管理,在程序执行完之后并不会自动释放。当整个程序执行完毕之后会由操作系统释放。

2.2K00
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    详解栈、全局、文字常量、程序代码

    (heap):一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。...注意它与数据结构中的是两回事,分配方式倒是类似于链表 全局(静态)(static): 全局变量和静态变量的存储是放在一块的,程序结束后由系统释放。...文字常量:常量字符串就是放在这里的。程序结束后由系统释放 程序代码:存放函数体的二进制代码。...,初始化 p = (char *)malloc(10);//分配得来的10和20字节的区域在 p1 = (char *)malloc(20);//分配得来的10和20字节的区域在...空间的分配总是动态的,虽然程序结束时所有的数据空间都会被释放回系统,但是精确的申请内存/释放内存匹配是良好 程序的基本要素。 一般所说的堆栈(stack)往往是指栈,先进后出, 它是一块内存

    36210

    结构体创建在

    ) { test(); return 0; } 原因:字符串指针指向字面常量,字面常量不能修改,但可以修改指针指向,指向其他的字符串常量 解决方法1: 改成char name[64] 方法2:在动态开辟一块内存...,来通过字符串拷贝函数来拷贝常量的字符串到 注意:如果t1.name="hello"那么存放的还是常量字符串的地址,还是无法修改字符串的内容 #define _CRT_SECURE_NO_WARNINGS...结构体创建在 #define _CRT_SECURE_NO_WARNINGS #include #include #include //结构体嵌套...; struct teacher { char* name; //字符串指针 int age; stu t; }*t1; void test() { t1 = NULL; //结构体创建在...,但是字符串指针只是在找了一块内存存放了一个指针 //此指针并没有指向任何一块内存,所以需要再再给它开辟一块内存,用来拷贝常量的字符串到,方便修改 t1->name = (char*)

    32710

    CC++中哪些数据存放于栈、静态、常量的详细说明

    (Stack) 栈用于存放局部变量和函数调用信息,它的内存由编译器自动分配和释放,具有自动管理的特点。栈的内存分配遵循先进后出的原则,生命周期是非常短暂的。...(Heap) 用于存放程序运行时动态分配的内存,程序员需要手动管理(分配和释放)。C++中可以通过new分配内存,通过delete释放。...总结: 下面是自己画的简易图: 栈以及旁边蓝色的箭头表示两者的生长方向 栈:从内存的顶部(高地址)开始,逐渐向下(低地址)分配内存。...:从内存的底部(低地址)开始,逐渐向上(高地址)分配内存。 栈(Stack)的生长: 生长方向:栈一般是向下生长的,即从高地址向低地址增长。...(Heap)的生长: 生长方向:的生长方向通常是向上生长的,即从低地址向高地址增长。

    15510

    JVM运行时数据-

    JVM运行时数据- 核心概念: 可以处于物理上不连续的内存空间,只需逻辑上连续即可。...一个JVM进程中是唯一的,一个进程有多个线程,所以是可以被一个JVM进程中的多个线程共享,也就是说是线程不安全的。...也就是内存是被线程共享的,但其中一小块区域TLAB(私有缓存)是线程私有的,我在后面详细学习哈。 在JVM启动的时候被创建,其大小也就被确定了。...可以通过**-Xmx和-Xms**来控制其最大内存和最小内存 如果中内存没有完成实例分配且无法再继续扩展,则会抛出OutOfMemory的异常(OOM)。...的构成: JDK1.8之前新生代-老年代 新生代又分为:Eden和Survivor Survivor区分为:Survivor From和Survivor TO(或者s0、s1) 频繁的对象创建和回收

    14220

    区内存分配区别

    ,它的内存分配是连续分配的,即,所分配的内存是在一块连续的内存区域内.当我们声明变量时,那么编译器会自动接着当前栈的结尾来分配内存. 2、(heap) 一般由程序员分配释放, 若程序员不释放,程序结束时可能由操作系统回收....类似于链表,在内存中的分布不是连续的,它们是不同区域的内存块通过指针链接起来的.一旦某一节点从链中断开,我们要人为的把所断开的节点从内存中释放. 3、全局(静态)(static) 全局变量和静态变量的存储是放在一块的...程序结束后由系统释放 4、文字常量 常量字符串就是放在这里的。 程序结束后由系统释放 5、程序代码 存放函数体的二进制代码。 先看一个例子....是向高地址扩展的数据结构,是不连续的内存区域。这是由于系统是用链表来存储的空闲内存地址的,自然是不连续的,而链表的遍历方向是由低地址向高地址。的大小受限于计算机系统中有效的虚拟内存。...:一般是在的头部用一个字节存放的大小。中的具体内容有程序员安排。

    1.2K30

    编码篇-iOS程序中的内存分配 栈全局等相关知识

    内存区域大致可以分为:栈、全局(静态)、文字常量、程序代码。学习内存相关的知识对我们的日常开发是十分必要的。 ---- 一.... 注意它与数据结构中的是两回事,分配方式倒是类似于链表。 是一种特殊的树形数据结构,每个结点都有一个值。通常我们所说的的数据结构,是指二叉。...(1)(heap) 由程序员分配和释放,如果程序员不释放,程序结束时,可能会由操作系统回收 ,比如在ios 中 alloc 都是存放在中。...(2)申请后的系统响应 1.首先应该知道操作系统有一个记录空闲内存地址的链表。...static int c =0; #全局(静态)初始化 w2 = (char *)malloc(20); #分配得来得10和20字节的区域就在

    1.6K20

    C++ 自由存储是否等价于

    “free store” VS “heap” 当我问你C++的内存布局时,你大概会回答: “在C++中,内存区分为5个,分别是、栈、自由存储、全局/静态存储、常量存储”。...事实上,我在网上看的很多博客,划分自由存储的分界线就是new/delete与malloc/free。...我们所需要记住的就是: 是操作系统维护的一块内存,而自由存储是C++中通过new与delete动态分配和释放对象的抽象概念。与自由存储并不等价。...直到我们在Bjarne Stroustrup的书籍中数次看到free store (自由存储),说实话,我一直把自由存储等价于。...new所申请的内存区域在C++中称为自由存储。藉由实现的自由存储,可以说new所申请的内存区域在堆上。 与自由存储还是有区别的,它们并非等价。

    3.5K70

    JVM内存—(heap)栈(stack)方法(method) (转)

    JAVA的JVM的内存可分为3个(heap)、栈(stack)和方法(method) : 1.存储的全部是对象,每个对象都包含一个与之对应的class的信息。...(class的目的是得到操作指令) 2.jvm只有一个(heap)被所有线程共享,中不存放基本类型和对象引用,只存放对象本身 栈: 1.每个线程包含一个栈,栈中只保存基础数据类型的对象和自定义对象的引用...(不是对象),对象都存放在中 2.每个栈中的数据(原始类型和对象引用)都是私有的,其他栈不能访问。...3.栈分为3个部分:基本类型变量、执行环境上下文、操作指令(存放操作指令)。 方法: 1.又叫静态,跟一样,被所有的线程共享。方法包含所有的class和static变量及常量。...4.Java虚拟机做的第一件事情就是在中为一个新的Sample实例分配内存, 这个Sample实例(指的是在中刚刚被分配了内存的实例)持有着指向方法的Sample类的类型信息的引用。

    39820

    【Java 虚拟机原理】 | Java VisualVM 工具

    文章目录 一、Java VisualVM 工具 二、 一、Java VisualVM 工具 ---- Java 中提供了一个监控当前设备 Java 程序的工具 Java VisualVM ; 在命令行中执行...jvisualvm 命令 , 可以打开该工具 ; 可以通过该程序监控 JVM 以及 Java 程序的运行参数 ; 二、 ---- 的对象分步如下图 : 的对象 分为 年轻代 ,..., Survivor 占 20\% ; Survivor 又分为 From 和 To 两部分 , 各占 10\% ; 新创建的对象 , 放到 中 , 会先放到 Eden ; 假设当前区内存是...操作 , 如果对象被判定为可以回收 , 就会将对象放到 Survivor 的 From 区域中 ; 此时 Eden 就有空间了 ; 在对象头中每个对象都有一个分代年龄 , 记录当前对象被回收了多少次...full GC 是针对 老年代区域放满进行的处理 ; 如果初始化了一个很大的对象 , 年轻代放不下 , 直接放到老年代 , 如果老年代也放不下 , OOM 送走这个进程 ; JVM 调优就是修改上述

    26510

    内存分配——静态存储 与static变量

    一、内存基本构成 可编程内存在基本上分为这样的几大部分:静态存储和栈。他们的功能不同,对他们使用方式也就不同。...换句话说,在数据只保留一份相同的数据 例二:栈 char* f1() { char* p = NULL; char a; p = &a; return...总之,对于、栈和静态存储它们之间最大的不同在于,栈的生命周期很短暂。...但是和静态存储的生命周期相当于与程序的生命同时存在(如果您不在程序运行中间将内存delete的话),我们将这种变量或数据成为全局变量或数据。...但是,对于的内存空间使用更加灵活,因为它允许你在不需要它的时候,随时将它释放掉,而静态存储将一直存在于程序的整个生命周期中。

    1.9K30

    常量池和的区别_字符串常量池在中还是方法

    如下 2.运行时常量池 2.1运行时常量池的简介 运行时常量池是方法的一部分。...博主一定会在第一时间参与讨论 4.1常量池和字符串常量池的版本变化 在JDK1.7之前运行时常量池逻辑包含字符串常量池存放在方法, 此时hotspot虚拟机对方法的实现为永久代 在JDK1.7...字符串常量池被从方法拿到了中, 这里没有提到运行时常量池,也就是说 字符串常量池被单独拿到,运行时常量池剩下的东西还在方法, 也就是hotspot中的永久代 在JDK1.8 hotspot移除了永久代用元空间...(Metaspace)取而代之, 这时候字符串常量池还在, 运行时常量池还在方法, 只不过方法的实现从永久代变成了元空间(Metaspace) 4.2String.intern在JDK6和JDK7...JDK7中,常量池在空间,s1.intern()去常量池中查找”11″,发现没有该常量,则在字符串常量池中开辟空间,指向空间地址,则返回字符串常量池指向的空间地址,s1也是空间地址,所以二者相等

    1.2K30

    java常量池在方法还是_JAVA常量池

    使用jvm看内存分区的使用情况的截图: 可以看到里面old总共90M,已经89M,这个是在报oom之前的截图。...方法总共就分了10m,在oom的时候,也就使用了7m多,说明这个常量池,在jdk1.7的时候,确实被安排到了Java heap里面了。 上面的说明加起来,使得下面这个理论得到了验证。...元空间并不是方法!!! 方法包括类信息、常量、静态变量等,是JVM规范。 方法是jvm规范里面的概念。 1.7之前方法的实现就是永久代。...1.7 把常量池和静态变量放入了中,也就是方法由永久代和实现。 1.8 把永久代删除使用元空间,也就是方法由元空间(类信息)和实现(常量池、静态变量)。...所以,说常量池在方法,是对的。因为方法是个概念的东西。

    2.9K20

    醒酒菜:动画图解核心内存--

    今天阿Q为大家准备了上好的“醒酒菜”——JVM运行时数据的核心内存——。...类,为饿汉式单例类); 一个运行时数据中的和方法是多线程共享的,而本地方法栈、虚拟机栈、程序计数器是线程私有的。...空间差不多是最大的内存空间,也是运行时数据最重要的内存空间。可以处于物理上不连续的内存空间,但在逻辑上它应该被视为连续的。...,ms是memory start ❝通常会将-Xms和-Xmx两个参数配置相同的值,其目的就是为了能够在java垃圾回收机制清理完后不需要重新分隔计算的大小,从而提高性能。...这是因为在内存存取数据时,新生代里边只有伊甸园和幸存者1或者是幸存者2存储对象,所以会少一个幸存者的内存空间。

    43310
    领券