内存的那些事

先说内存存储区域分类:

代码区(text segment):主要包含操作代码和操作对象的地址,地址指向对象存放的区域(堆,栈,静态存储区等),具体的数值也包含在代码中。代码区的代码按照程序规则顺序执行,反复,则需要使用跳转指令,递归,需要借助栈来实现。

静态存储区(data segment):主要存储全局变量(extern),静态变量(static),主要特点是指初始化一次

未初始化数据区(bss):主要存储全局未初始化的变量,例如未在任何方法中声明的一些变量:NSString *age;

栈(stack):由编译器自动分配和释放,栈的栈顶地址和容量大小时系统预先规定好的,所以是一块连续的内存区域。存储非静态的局部变量,函数方法参数和返回值的指针等,栈的大小一般只有几兆,当系统内存不够分配时,系统会提示栈内存溢出。递归,每次地柜调用方法时,都会生成一个新的栈列,这样多个调用方法之间的变量不会混淆。

堆区(heap): 位于bss和栈之间,由程序员动态分配,需要手动释放,或者程序结束时,os自动释放

内存的分配方式:

静态分配:编译器在处理程序源代码时分配,在程序执行之前进行,效率比较高,静态对象是有名字的变量,可以直接对其进行操作,自动分配,自动释放

动态分配:程序在执行时,调用malloc库函数申请内存,动态对象时没有名字的变量,通过指针进行间接操作,手动释放

堆和栈的区别:

1.储存对象不同

2.管理方式不同:栈自动分配释放,堆手动分配释放

3.空间大小不同:栈大小一般只有1到2m,且是一段连续的区域,栈中的元素都是有序的,先进后出的原则,不会出现从中间弹出的情况。堆是从高地址扩展的数据结构,不连续,系统用链表来存储地址,堆的空间比较大,手动分配和释放,比较灵活

4.是否出现泄漏:栈自动分配和释放,不会出现泄漏。堆上手动分配空间,且分配的空间的不连续,会出现大量的碎片,使用效率并不高,需要手动释放,防止出现泄漏

5.增长方向不同:堆的内存地址增长从低到高,栈相反

6.分配方式不同:栈自动分配释放,堆手动分配释放

7.分配效率不同:栈由系统分配,入栈出栈都有专门的指令,效率较高。堆需要计算内存空间大小,不够分配的,需要重新整理内存空间,所以效率较低

时间: 2024-08-15 07:40:34

内存的那些事的相关文章

【C语言探索之旅】 第一部分第四课第一章:变量的世界之内存那档事

内容简介 1.课程大纲 2.第一部分第四课第一章:变量的世界之内存那档事 3.第一部分第四课第二章预告:变量的世界之声明变量 课程大纲 我们的课程分为四大部分,每一个部分结束后都会有练习题,并会公布答案.还会带大家用C语言编写三个游戏. C语言编程基础知识 什么是编程? 工欲善其事,必先利其器 你的第一个程序 变量的世界 运算符 条件表达式 循环语句 实战:第一个C语言小游戏 函数 练习题 习作:完善第一个C语言小游戏 C语言高级技术 模块化编程 进击的指针,C语言王牌 数组 字符串 预处理 创

【C#】CLR内存那点事(string)

string是比特殊的类,说引用类型,但不存在堆里面,而且String str=new String("HelloWorld")这样的重装也说没有的. 我们先来看一个方法 class Program { static void Main(string[] args) { String s = "HelloWorld"; Console.WriteLine(s); } } 然后我们用ildasm.exe工具把它生成IL语言来看一看它里面是怎么玩的: .method p

【C#】CLR内存那点事(初级)

最近回头看了一下书,对内存的理解又有新的认识.我所关注的内存里面说没有寄存器的,所以我关注的只有 托管堆(heap),栈(stack), 字符串常量池(string是一个很特殊的对象) 首先我们看两个方法: void M1() { string name = "Tom"; M2(name); } void M2(string name) { int length = 10; double rate = 10.0; name = "Joe"; return; } [C

聊聊高并发(三十六)Java内存模型那些事(四)理解Happens-before规则

在前几篇将Java内存模型的那些事基本上把这个域底层的概念都解释清楚了,聊聊高并发(三十五)Java内存模型那些事(三)理解内存屏障 这篇分析了在X86平台下,volatile,synchronized, CAS操作都是基于Lock前缀的汇编指令来实现的,关于Lock指令有两个要点: 1. lock会锁总线,总线是互斥的,所以lock后面的写操作会写入缓存和内存,可以理解为在lock后面的写缓存和写内存这两个动作称为了一个原子操作.当总线被锁时,其他的CPU是无法使用总线的,也就让其他的读写都等

【C#】CLR内存那点事(高级)

对于这篇,不想再对值类型进行讨论,如要看值类型的内存怎么玩可以看一下(CLR内存那点事 初级),我们这篇主要讨论一下引用类型. 先来装备两个类 internal class Employee { public static Employee LookUp(string name) { return null; } public virtual string GetProgressReport() { return string.Empty; } } internal class Manager

【转】CPU与内存的那些事

下面是网上看到的一些关于内存和CPU方面的一些很不错的文章. 整理如下: 转: CPU的等待有多久? 原文标题:What Your Computer Does While You Wait 原文地址:http://duartes.org/gustavo/blog/ [注:本人水平有限,只好挑一些国外高手的精彩文章翻译一下.一来自己复习,二来与大家分享.] 本文以一个现代的.实际的个人电脑为对象,分析其中CPU(Intel Core 2 Duo 3.0GHz)以及各类子系统的运行速度——延迟和数据

JVM 内存的那些事

转自:http://blog.jobbole.com/104863/ 对于Java程序员你来说,在虚拟机内存管理的帮助下,不需要为每个new对象都匹配free操作,内存泄露和内存溢出等问题也不太容易出现,不过也正是因为把内存管理交给了虚拟机,一旦运行中的程序出现了内存泄露问题,给排查过程造成很大困难.所以只有理解了Java虚拟机的运行机制,才能够运筹帷幄于各种代码.本文以HotSpot为例说说虚拟机的那些事. JAVA虚拟机把管理的内存划分为几个不同的数据区. Java堆 Java堆是被所有线程

JVM内存的那些事

前言 对于C语言开发的程序员来说,在内存管理方面,必须负责每一个对象的生命周期,从有到无. 对于Java程序员你来说,在虚拟机内存管理的帮助下,不需要为每个new对象都匹配free操作,内存泄露和内存溢出等问题也不太容易出现,不过也正是因为把内存管理交给了虚拟机,一旦运行中的程序出现了内存泄露问题,给排查过程造成很大困难.所以只有理解了Java虚拟机的运行机制,才能够运筹帷幄于各种代码.本文以HotSpot为例说说虚拟机的那些事. JAVA虚拟机把管理的内存划分为几个不同的数据区. Java堆

转:CPU与内存的那些事

下面是网上看到的一些关于内存和CPU方面的一些很不错的文章. 整理如下: 转: CPU的等待有多久? 原文标题:What Your Computer Does While You Wait 原文地址:http://duartes.org/gustavo/blog/ [注:本人水平有限,只好挑一些国外高手的精彩文章翻译一下.一来自己复习,二来与大家分享.] 本文以一个现代的.实际的个人电脑为对象,分析其中CPU(Intel Core 2 Duo 3.0GHz)以及各类子系统的运行速度——延迟和数据

CPU与内存的那些事

本文以一个现代的.实际的个人电脑为对象,分析其中CPU(Intel Core 2 Duo 3.0GHz)以及各类子系统的运行速度--延迟和数据吞吐量.通过粗略的估算PC各个组件的相对运行速度,希望能给大家留下一个比较直观的印象.本文中的数据来自实际应用,而非理论最大值.时间的单位是纳秒(ns,十亿分之一秒),毫秒(ms,千分之一秒),和秒(s).吞吐量的单位是兆字节(MB)和千兆字节(GB).让我们先从CPU和内存开始,下图是北桥部分: 第一个令人惊叹的事实是:CPU快得离谱.在Core 2 3