精华内容
下载资源
问答
  • CS(CodeString)指向的是指令段地址,指令段寄存器DS(DataString)指向的是数据段地址,数据段寄存器SS(StackString)指向的是栈顶段地址,栈段寄存器内存中数据和程序没有区别,说都是以2进制形式存储CS指向的段地址...

    数据和程序有区别吗?如何确定内存中的信息哪些是数据,哪些是程序?

     

    CS(CodeString)指向的是指令段地址,指令段寄存器DS(DataString)指向的是数据段地址,数据段寄存器SS(StackString)指向的是栈顶段地址,栈段寄存器内存中的数据和程序没有区别,说都是以2进制形式存储CS指向的段地址里,存的是指令DS指向的段地址里,存的是数据

    数据和程序在内存中都是已2进制的数据存贮,只有当2进制的数据被CS:IP指向时,才成为可执行的指令 或 程序。

    数据和程序在内存中是没有区别的,它们都是内存中的数据,当EIP指针指向哪 CPU就加载那段内存中的数据,如果是不正确的指令格式,CPU就会发生错误中断.
    在现在CPU的保护模式中,每个内存段都其描述符,这个描述符记录着这个内存段的访问权限(可读,可写,可执行).这最就变相的指定了哪个些内存中存储的是指令哪些是数据.

     

    展开全文
  • java的基本数据类型引用数据类型以及它们的存储方式堆内存和内存

      一直对java中的基本数据类型和引用数据类型之间的关系搞不太清楚,今天做leetcode的一道题目,总算弄清楚了关系。写下来和大家一起分享一下。


      一 基本数据类型

     数据类型在计算机语言里面,是对内存位置的一个抽象表达方式,可以理解为针对内存的一种抽象的表达方式。基本类型:简单数据类型是不能简化的、内置的数据类型、由编程语言本身定义,它表示了真实的数字、字符和整数。在java中基本数据类型一共有8种,包括

    byte:Java中最小的数据类型,在内存中占8位(bit),即1个字节,取值范围-128~127,默认值0;

    short:短整型,在内存中占16位,即2个字节,取值范围-32768~32717,默认值0;

    int:整型,用于存储整数,在内在中占32位,即4个字节,取值范围-2147483648~2147483647,默认值0;

    long:长整型,在内存中占64位,即8个字节-2^63~2^63-1,默认值0L;

    float:浮点型,在内存中占32位,即4个字节,用于存储带小数点的数字(与double的区别在于float类型有效小数点只有6~7位),默认值0;

    double:双精度浮点型,用于存储带有小数点的数字,在内存中占64位,即8个字节,默认值0;

    char:字符型,用于存储单个字符,占16位,即2个字节,取值范围0~65535,默认值为空;

    boolean:布尔类型,占1个字节,用于判断真或假(仅有两个值,即true、false),默认值false;


      二 引用数据类型

     引用数据类型:Java语言本身不支持C++中的结构(struct)或联合(union)数据类型,它的复合数据类型一般都是通过类或接口进行构造,类提供了捆绑数据和方法的方式,同时可以针对程序外部进行信息隐藏。引用数据类型分3种:类,接口,数组;

     三 数据类型与内存的关系

      java把内存分为两种,一种是堆内存,一种是栈内存。

      基本类型类型以及对象的引用变量是存储在栈内存中,当在一段代码块中定义一个变量时,java就在栈中为这个变量分配内存空间,当超过变量的作用域后,java会自动释放掉为该变量分配的内存空间,该内存空间可以立刻被另作他用。

      而对象本身的值或者说new创建的对象和数组是存储在堆内存中。在堆中分配的内存,由java虚拟机自动垃圾回收器来管理。在堆中产生了一个数组或者对象后,还可以在栈中定义一个特殊的变量(对象的引用变量),这个变量的取值等于数组或者对象在堆内存中的首地址,在栈中的这个特殊的变量就变成了数组或者对象的引用变量,以后就可以在程序中使用栈内存中的引用变量来访问堆中的数组或者对象,引用变量相当于为数组或者对象起的一个别名,或者代号。

      数组和对象在没有引用变量指向它的时候,才变成垃圾,不能再被使用,但是仍然占着内存,在随后的一个不确定的时间被垃圾回收器释放掉。这个也是java比较占内存的主要原因,实际上,栈中的变量指向堆内存中的变量,这就是 Java 中的指针!

      找了一个图,可以更形象的描述它们之间的关系。

      


      四 java中内存分配策略

      按照编译原理的观点,程序运行时的内存分配有三种策略:静态的,栈式的,堆式的。
      
      静态存储分配是指在编译时就能确定每个数据目标在运行时刻的存储空间需求,因而在编译时就可以给他们分配特定的存储空间。静态存储分配要求程序中不允许有可变数据结构的存在(比如数组,链表),也不允许有嵌套或者递归的结构出现,因为它们会导致编译程序无法计算准确的存储空间需求。

      栈式分配(动态存储分配)是由一个类似于堆栈的运行栈来实现的。在栈式存储方案中,程序对数据区的需求在编译时是完全未知的,只有到运行的时候才能够知道,但是规定在运行中进入一个程序模块时,必须知道该程序模块所需的数据区大小才能够为其分配内存.和我们在数据结构所熟知的栈一样,栈式存储分配按照先进后出的原则进行分配。 

      静态存储分配要求在编译时能知道所有变量的存储要求,栈式存储分配要求在过程的入口处必须知道所有的存储要求,而堆式存储分配则专门负责在编译时或运行时模块入口处都无法确定存储要求的数据结构的内存分配,比如可变长度串和对象实例.堆由大片的可利用块或空闲块组成,堆中的内存可以按照任意顺序分配和释放. 


      五 java中的堆和栈  

      栈与堆都是Java用来在Ram中存放数据的地方。与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆。 

      Java的堆是一个运行时数据区,类的(对象从中分配空间。这些对象通过new、newarray、anewarray和multianewarray等指令建立,它们不需要程序代码来显式的释放。堆是由垃圾回收来负责的,堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,因为它是在运行时动态分配内存的,Java的垃圾收集器会自动收走这些不再使用的数据。但缺点是,由于要在运行时动态分配内存,存取速度较慢。 

      栈的优势是,存取速度比堆要快,仅次于寄存器,栈数据可以共享。但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。栈中主要存放一些基本类型的变量(,int, short, long, byte, float, double, boolean, char)和对象句柄。 

    展开全文
  • 本文主要介绍程序中内存以及内存与栈、堆、数据区的关系。 由于字多看的眼睛疼,所以分为四个部分如下: C语言精讲之程序中内存从哪里来(2)栈 C语言精讲之程序中内存从哪里来(3)堆 C语言精讲之程序中内存从...

    本文是自己的学习笔记,我将笔记写在博客中出来。本文主要介绍程序中的内存以及内存与栈、堆、数据区的关系。
    由于字多看的眼睛疼,所以分为四个部分如下:
    C语言精讲之程序中内存从哪里来(1)内存
    C语言精讲之程序中内存从哪里来(2)栈
    C语言精讲之程序中内存从哪里来(3)堆
    C语言精讲之程序中内存从哪里来(4)数据段

    按照以下顺序介绍它们的关系:
    1、内存
    2、栈
    3、堆
    4、数据区

    1、内存

    1.1、程序执行为什么需要内存?

    因为程序执行需要内存支持
    内存就是程序的立足之地(程序是被放到内存中运行的);程序运行时需要内存来存储一些临时的变量。相当于程序要生存,内存就是程序的生存空间。

    1.2、内存管理最终是由操作系统完成的

    (1)、内存本身在物理上是一个硬件器件,由*件系统提供。
    (2)、有操作系统情况下,内存是由系统统一管理,为了内存管理方便又合理,操作系统提供了多种机制来让我们应用程序使用内存。
    (3)、这些机制彼此不同,各有各种的特点,我们程序根据自己的实际情况来选择某种方式获取内存(在操作系统处登记这块内存的临时使用权限)、使用内存释放内存(向操作系统归还这块内存的使用权限)

    好比:一个人去住酒店(酒店相当于操作系统),首先根据自己的实际情况来选择不同的房间,然后去前台登记自己对房间的暂时使用权限(被人不能访问)(申请内存),然后晚上会用房间(使用内存),到了使用完毕之后第二天去退房(释放内存)。

    2.3、三种内存来源:栈(stack)、堆(heap)、数据区(.data)

    在一个C语言程序里面,能够获取的的内容就只有三种情况的内存来源(也就是操作系统提供的机制):(stack)、(heap)、数据区(.data)。

    写一个例子来体现三种方法:

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    
    char b[]="linux";   //第三种方法:定义全局变量,放在数据段上
    
    int main()
    {
       char a[]="linux";    //第一种方法:定义局部变量,放在栈上
    
       char *c=(char *)malloc(10);  //第二种方法:放在堆内存中
       if(NULL == c)
       {
           printf("malloc error\n");
           return -1;
       }
       memset(c,0,10);
       strcpy(c,"linux");
    
       printf("%s\n",a);
       printf("%s\n",b);
       printf("%s\n",c);
    
       printf("%p\n",a);
       printf("%p\n",b);
       printf("%p\n",c);
    
       free(c);     //malloc释放内存
       c=NULL;
    
    	return 0;
    }
    
    展开全文
  • 经常看到uboot里面有清bbs段.一直都不明白,bbs段是什么东西,为什么要清,有什么作用. 还有其他段,都是些什么关系。 ...第一种情况:a.out:有代码段(text) 数据段(data), 未初始化数据段段(bbs)

    经常看到uboot里面有清bbs段.一直都不明白,bbs段是什么东西,为什么要清,有什么作用. 还有其他段,都是些什么关系。

    c语言中总体来说,分两种情况:1.编译出来可执行文件放在存储盘上(硬盘),

                                                 2.在内存上运行的时候的段.

    第1种情况:比如.a.out:有代码段(text) 数据段(data), 其他段(调试的段,动态库共享库链接表的段)

    第2中情况:在内存中运行.  text段  data段  bbs段  heap  stack 

    具体情况见下图:


    在x86上,一般栈从0xc000 0000(栈底)开始.  堆顶和栈底之间,我们的mmap函数可以用到的空间。 

     forK一个进程,从图里面看出来,父子进程间共享的只有代码段。

    对于子进程来说,他父进程的数据空间(data  bbs 堆 栈 )的副本, 

    副本的理解就是父进程定义了,子进程就定义了,当时我们不共享,

    不共享的意思就是比如父进程改变了某个值,子进程不会因为父进程对这个值的改变而改变。


    head里面是命令行参数和环境变量


    #include <stdio.h>
    extern char **environ;
    int main(int argc, char **argv)
    {
            char i = 0, j = 0;
            for (i = 0; i < argc; i++ )
                    printf("argv[%d]: %s\n", i, *(argv+i));
    
            for (;environ[j] != NULL;j++)
                    printf("environ[%d]: %s\n", j, *(environ+j));
    
            return 0;
    }
    




    我们说的data(初始化的段)   bbs段(未初始化的段) 都是针对全局变量和静态变量来说的.

    data又分为读写数据段(rw data) 和 只读数据段(ro data)

    bbs是未初始化的全局变量和静态变量和 初始化为0 的全局变量和静态变量.

    我们在函数里面的定义的局部变量(除static xxx)都是在stack or  heap里面.  

    bbs段不影响a.out的大小,bbs段的数据用占位符标示而已,不在a.out里面.运行才产生.

    stack heap也都是在运行的时候产生.


    堆栈区(stack),堆栈是由编译器自动分配释放,存放函数的参数值,局部变量的值等.栈的申请是由系统自动分配,如在函数内部申请一个局部变量 int h,同时判别所申请空间是否小于栈的剩余空间,如若小于的话,在堆栈中为其开辟空间,为程序提供内存,否则将报异常提示栈溢出。  

    其次是堆(heap),堆一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收 。堆的申请是由程序员自己来操作的,在C中使用malloc函数,而C++中使用new运算符,但是堆的申请过程比较复杂。





      





    展开全文
  • 程序内存空间(代码段、数据段、堆栈段)

    万次阅读 多人点赞 2016-08-24 20:55:12
    在冯诺依曼的体系结构必须有:代码段,堆栈段,数据段。 进程的虚拟地址空间图示如下: 堆栈段:  1. 为函数内部的局部变量提供存储空间。  2. 进行函数调用时,存储“过程活动记录”。  3. 用作暂时...
  • Wince程序内存和存储内存

    千次阅读 2010-04-20 09:51:00
    Wince 下的内存实际上是分为三个部分的. 先说这几部分的名字,对象存储, 系统内存程序内存.... 在wince系统的控制面板系统可以看到系统内存在30M左右,但是硬件上SDRAM明明是64M,为什么这里只有30M呢?因为wi
  • 比较全面的总结了诸多版本,知识无国界,感谢各位的...首先在数据结构上要知道堆栈,尽管我们这么称呼它,但实际上堆栈是两种数据结构:堆栈。  堆栈都是一种数据项按序排列的数据结构。 栈就像装数据的桶或
  • 转自:... ld 时把所有的目标文件的代码段组合成一个代码段,把所有的数据段组合成一个数据段. ##############################################################
  • 程序内存分配之堆栈的区别

    万次阅读 多人点赞 2015-10-01 09:38:52
    在单片机应用,堆栈是个特殊的存储区,主要功能是暂时存放数据和地址,通常用来保护断点现场。要点: 堆,优先队列(priority queue);普通的队列是一种先进先出的数据结构(FIFO—First-In/First-Out),元
  • 程序运行时的内存空间分布

    万次阅读 多人点赞 2014-03-21 01:33:18
    我们在写程序时,既有程序的逻辑代码,也有在程序中定义的变量等数据,那么当我们的程序进行时,我们的代码和数据究竟是存放在哪里的呢?下面就来总结一下。 一、程序运行时的内存空间情况 其实在程序运行时,...
  • 一、内存映射 内存映射文件允许开发人员预定一块地址空间区域并给区域调拨物理存储器。内存映射文件的物理存储器来自磁盘已有的文件,而不是来自系统的页交换文件。一旦把文件映射到地址空间,就可以对它进行访问,...
  • linux运行程序占用内存

    千次阅读 2014-12-17 11:42:05
    1. 在linux下,查看一个运行程序, 占用了多少内存, 一般的命令有  (1). ps aux:  其中 VSZ(或VSS)列 表示,程序占用了多少虚拟内存。  RSS列 表示, 程序占用了多少物理内存。  虚拟...
  • ...文件有10G个整数,乱序排列,要求找出位数  (2010-09-25 18:15:03) 转载▼ 标签:  杂谈 分类: 算法   题目:在一个文件有 10G 个整数
  • C程序内存管理

    千次阅读 2014-10-02 01:38:17
    本文记录了C程序内存中存储结构、C变量函数常见的存储类型、分配回收内存等方面的内容。以下C程序所使用的编译器版本是GCC 4.4.7。 从一个C程序说起 文件的结构 对于以下这段Hello.c程序再熟悉不过了 #include...
  • 内存数据结构之栈堆的区别?

    千次阅读 2018-01-15 15:56:37
    可能很多同学在这个概念上有些模糊,其实堆栈分为数据结构和内存的。数据结构的堆栈我想很多同学学习过,今天介绍下数据结构的堆栈,但是重点是内存的堆栈整理。 数据结构的栈堆 首先在数据结构上要知道堆栈,...
  • 基本数据类型引用数据类型在栈进行分配在堆进行分配,堆的读写速度远不及栈变量名指向具体的数值变量名指向存数据对象的内存地址,即变量名指向hash值变量在声明之后java就会立刻分配给他内存空间它以特殊的方式...
  • 对一个程序内存中的分析

    千次阅读 2012-02-29 08:23:13
    bullbat 译    内存管理是操作系统的核心;它对于程序员系统管理员都很...这第一篇文章谈论程序内存中如何存放。  在多任务操作系统的每一个进程运行在他自己的内存地址空间。这个地址空间就是虚拟地
  • 大页内存(HugePages)在通用程序优化的应用

    万次阅读 多人点赞 2014-12-13 20:04:04
    今天给大家介绍一种比较新奇的程序性能优化方法—大页内存(HugePages),简单来说就是通过增大操作系统页的大小来减小页表,从而避免快表缺失。这方面的资料比较贫乏,而且网上绝大多数资料都是介绍它在Oracle...
  • 数据内存中的存储总结

    千次阅读 多人点赞 2018-11-04 20:33:05
    数据类型介绍: 基本内置类型分别为: char //字符数据类型 short //短整型 int //整形 long //长整型 long long //更长的整形 float //单精度浮点数 ...//注意: C语言没有字符串类型 类型的意义: 1. 使...
  • 下面我们详细了解Java内存区域:先说明JVM规范定义的JVM运行时分配的数据区有哪些,然后分别介绍它们的特点,并指出给出一些HotSpot虚拟机实现的不同点调整参数。
  • Redis的作者Salvatore Sanfilippo曾经对这两种基于内存数据存储系统进行过比较: Redis支持服务器端的数据操作:Redis相比Memcached来说,拥有更多的数据结构并支持更丰富的数据操作,通常在Memcached里,你...
  • 3.全局区(静态区),全局变量静态变量的存储是放在一块的,初始化的全局变量静态变量在一块区域,未初始化的全局变量未初始化的静态变量在相邻的另一块区域。- 程序结束释放 4.另外还有一个专门放常量的地方...
  • 计算机主要的存储部件是内存和磁盘。磁盘存储的程序必须加载到内存之后才能运行。在磁盘保存的原始程序是无法直接运行的。这是因为,负责解析运行程序内容的CPU,需要通过内部程序计数器来指定内存地址,...
  • 没有内存,怎么还能跑程序

    万次阅读 多人点赞 2020-02-26 10:33:00
    虽然目前大多数内存的增长速度要比 IBM 7094 要快的多,但是,程序大小的增长要比内存的增长还快很多。正如帕金森定律说的那样:不管存储器有多大,但是程序大小的增长速度比内存容量的增长速度要快的多。下面我们...
  • 知道c++的变量存储方式,... C++编译器将计算机内存分为代码区和数据区,很显然,代码区就是存放程序代码,而数据区则是存放程序编译执行过程出现的变量常量。数据区又分为静态数据区、动态数据区,动态数据区包
  • LINUX程序(进程)在内存中的布局

    千次阅读 2015-07-30 02:00:33
    翻译自: ... 是编程系统管理的关键部分,在接下来的几篇文章会从实际应用 内部角度对内存管理模块进行分析. 内存管理的相关概念都是通用的,我们依照32位的linuxwi
  • 在驱动应用程序间共享内存

    千次阅读 2016-02-17 11:33:52
    在不同的场合,很多驱动编写人员需要在驱动用户程序间共享...l 应用程序发送IOCTL给驱动程序,提供一个指向内存的指针,之后驱动程序和应用程序就可以共享内存。(应用程序分配共享内存)    l 由
  • 内存注入综合程序 1) 进程列表获取 2) IAT表项获取 3) IAT Hook 4) Inline Hook

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 892,843
精华内容 357,137
关键字:

内存中只有程序和数据