精华内容
下载资源
问答
  • C语言指针与汇编内存地址(二)

    千人学习 2016-05-26 10:37:35
    C语言指针与汇编内存地址视频教程,该课程学习和使用过C语言的程序员都认为要做到对指针这一概念的透彻理解和灵活运用相当困难。本课程会详细讲解C语言与指针、以及如何查看汇编内存等C语言高级教程内容。
  • Python对象内存地址

    万次阅读 多人点赞 2018-08-02 16:58:59
    这里我们只简单看下python对象内存地址的相关基础知识,以及编码过程中一些注意事项,关于python解释器的内存管理机制,涉及到解释器内核的内存池原理,这里不做深入探讨,兴趣的朋友可以去阅读解释器源代...

        在python中,万物皆对象,常见的整数、浮点数、字符串、元祖、列表等类型,以及各种class、class instance等等都是对象。这些对象在python解释器内部的地址是怎样的呢?这里我们只简单看下python对象内存地址的相关基础知识,以及编码过程中一些注意事项,关于python解释器的内存管理机制,涉及到解释器内核的内存池原理,这里不做深入探讨,有兴趣的朋友可以去阅读解释器源代码。

    0x01 不可变对象

        不可变对象是指对象的内存值不能被改变。Python中变量以引用的方式指向对象,如果变量引用了不可变对象,当改变该变量时,由于其所指的对象的值不能被改变,相当于把原来的值复制一份后再改变,这会开辟一个新的地址,变量再指向这个新的地址,即变量引用了新的对象。

        数值类型(整数和浮点)、字符串str、元组tuple都是不可变类型。比如a=1,b=[1],c={'a':1},id(a)、id(b[0])、id(1)、id(c['a'])将输出一样的值,因为1是不可变对象,其在内存中是不可改变的。

    0x02 可变对象

        可变对象是指对象的内存值可以被改变,变量(准确的说是引用)改变后,实际上是其所指的值直接发生改变,并没有发生复制行为,也没有开辟新的内存地址,通俗点说就是原地改变。列表list、字典dict、集合set是可变类型。

    0x03 对象的内存地址

        可以使用内置函数id()查看python对象的内存地址。下面是一些注意事项:

        (1) python中所有数字、字符串、list等值,创建时会分配内存空间,变量通过引用的方式使用它们。比如a=1和b=1,id(a)和id(b)的输出一样,表示a和b都指向相同的内存地址,即引用了同一个不可变对象;但是a=[1]和b=[1],id(a)和id(b)将输出不一样的值,a和b指向的是不同的内存地址,即引用了不同的可变对象,说明各可变对象是相互独立的,在内存中有独立的内存地址

        (2) 可用 is 判断两个对象的id(即内存地址)是否一样,用 == 判断两个对象的值是否一样。None值也有内存地址

        (3) list、set对象有各自的独立内存空间,他们的各元素以引用的方式指向可变、不可变对象;

        (4) 函数形参的默认值,在内存中会开辟独立的内存空间。比如测试代码中test函数的param参数,其默认值是空list,如果调用时未传参,则param指向内存中预先分配好的地址,该地址存储的是list类型的值;当调用时传参为a,则param引用了a指向的内存空间;

        (5) python使用引用计数和垃圾回收来释放内存对象,每个内存对象都维护了一个引用计数包括各种数字、字符串、list、set等类型值,以及类实例对象等等,当这些对象的引用计数为 0 时,会被解释器回收内存。每次对对象进行引用操作,都会导致其引用计数加1, 如下面测试代码中的整数1,列表a、b、c、d、n都引用了整数1,以及test函数中的append操作,都会导致数字1的引用计数加1

        (6) copy和deepcopy方法都创建了新的内存对象,如测试代码中的b和c都是新的变量,其各个元素可能是指向同一个内存空间。赋值操作是指向同一个内存块,同时增加引用计数。copy是浅拷贝,deepcopy是深拷贝,特别对于可变对象,copy是以引用的方式指向同一个可变对象,而deepcopy会开辟新的内存地址,也就是创建了新的可变对象。

    0x04 测试代码

    # -*- coding: utf8 -*-
    import copy
    import sys
    
    a = [1, 2, [3, 4]]
    b = copy.copy(a)
    c = copy.deepcopy(a)
    d = a
    
    print 'address of a:', id(a)
    print 'address of b:', id(b)
    print 'address of c:', id(c)
    print 'address of d:', id(d)
    print 'address of 1:', id(1)
    print 'address of element 0 in a:', id(a[0])
    print 'address of element 0 in b:', id(b[0])
    print 'address of element 0 in c:', id(c[0])
    print 'a=', a
    print 'b=', b
    print 'c=', c
    print 'd=', d
    
    a[0] = 99
    print 'a=', a
    print 'b=', b
    print 'c=', c
    print 'd=', d
    
    print 'address of element 0 in a:', id(a[0])
    print 'address of element 0 in b:', id(b[0])
    print 'address of element 0 in c:', id(c[0])
    
    print 'address of element 2 in a:', id(a[2])
    print 'address of element 2 in b:', id(b[2])
    print 'address of element 2 in c:', id(c[2])
    
    a[2].append(5)
    print 'a=', a
    print 'b=', b
    print 'c=', c
    print 'd=', d
    
    def test(param=[]):
        print 'address of param:', id(param)
        param.append(1)
        print 'reference count of 1:', sys.getrefcount(1)
        return param
    
    print test(a)
    print test()
    print test()
    print 'a=', a
    print 'b=', b
    print 'c=', c
    print 'd=', d
    
    print 'reference count of 1:', sys.getrefcount(1)
    n = 1
    print 'reference count of 1:', sys.getrefcount(1)
    del n
    print 'reference count of 1:', sys.getrefcount(1)
    
    

    0x06 运行结果

    address of a: 54681224
    address of b: 54716296
    address of c: 54692104
    address of d: 54681224
    address of 1: 48258856
    address of element 0 in a: 48258856
    address of element 0 in b: 48258856
    address of element 0 in c: 48258856
    a= [1, 2, [3, 4]]
    b= [1, 2, [3, 4]]
    c= [1, 2, [3, 4]]
    d= [1, 2, [3, 4]]
    a= [99, 2, [3, 4]]
    b= [1, 2, [3, 4]]
    c= [1, 2, [3, 4]]
    d= [99, 2, [3, 4]]
    address of element 0 in a: 48260488
    address of element 0 in b: 48258856
    address of element 0 in c: 48258856
    address of element 2 in a: 54692232
    address of element 2 in b: 54692232
    address of element 2 in c: 54716360
    a= [99, 2, [3, 4, 5]]
    b= [1, 2, [3, 4, 5]]
    c= [1, 2, [3, 4]]
    d= [99, 2, [3, 4, 5]]
    address of param: 54681224
    reference count of 1: 161
    [99, 2, [3, 4, 5], 1]
    address of param: 54716424
    reference count of 1: 162
    [1]
    address of param: 54716424
    reference count of 1: 163
    [1, 1]
    a= [99, 2, [3, 4, 5], 1]
    b= [1, 2, [3, 4, 5]]
    c= [1, 2, [3, 4]]
    d= [99, 2, [3, 4, 5], 1]
    reference count of 1: 163
    reference count of 1: 164
    reference count of 1: 163

     

    展开全文
  • 在解释第一个问题之前,先说明一下计算机内存管理的中的四个名词:虚拟内存,虚拟内存地址,物理内存,物理内存地址。先说说为什么虚拟内存和物理内存的区别。正在运行的一个进程,他所需的内存是可能大于内存...
    在解释第一个问题之前,先说明一下计算机内存管理的中的四个名词:虚拟内存,虚拟内存地址,物理内存,物理内存地址。

    先说说为什么会有虚拟内存和物理内存的区别。正在运行的一个进程,他所需的内存是有可能大于内存条容量之和的,比如你的内存条是256M,你的程序却要创建一个2G的数据区,那么不是所有数据都能一起加载到内存(物理内存)中,势必有一部分数据要放到其他介质中(比如硬盘),待进程需要访问那部分数据时,在通过调度进入物理内存。所以,虚拟内存是进程运行时所有内存空间的总和,并且可能有一部分不在物理内存中,而物理内存就是我们平时所了解的内存条。有的地方呢,也叫这个虚拟内存为内存交换区。

    那么,什么是虚拟内存地址和物理内存地址呢。假设你的计算机是32位,那么它的地址总线是32位的,也就是它可以寻址0~0xFFFFFFFF(4G)的地址空间,但如果你的计算机只有256M的物理内存0x~0x0FFFFFFF(256M),同时你的进程产生了一个不在这256M地址空间中的地址,那么计算机该如何处理呢?回答这个问题前,先说明计算机的内存分页机制。

    计算机会对虚拟内存地址空间(32位为4G)分页产生页(page),对物理内存地址空间(假设256M)分页产生页帧(page frame),这个页和页帧的大小是一样大的,所以呢,在这里,虚拟内存页的个数势必要大于物理内存页帧的个数。在计算机上有一个页表(page table),就是映射虚拟内存页到物理内存页的,更确切的说是页号到页帧号的映射,而且是一对一的映射。但是问题来了,虚拟内存页的个数 > 物理内存页帧的个数,岂不是有些虚拟内存页的地址永远没有对应的物理内存地址空间?不是的,操作系统是这样处理的。操作系统有个页面失效(page fault)功能。操作系统找到一个最少使用的页帧,让他失效,并把它写入磁盘,随后把需要访问的页放到页帧中,并修改页表中的映射,这样就保证所有的页都有被调度的可能了。这就是处理虚拟内存地址到物理内存的步骤。

    现在来回答什么是虚拟内存地址和物理内存地址。虚拟内存地址由页号(与页表中的页号关联)和偏移量组成。页号就不必解释了,上面已经说了,页号对应的映射到一个页帧。那么,说说偏移量。偏移量就是我上面说的页(或者页帧)的大小,即这个页(或者页帧)到底能存多少数据。举个例子,有一个虚拟地址它的页号是4,偏移量是20,那么他的寻址过程是这样的:首先到页表中找到页号4对应的页帧号(比如为8),如果页不在内存中,则用失效机制调入页,否则把页帧号和偏移量传给MMC(CPU的内存管理单元)组成一个物理上真正存在的地址,接着就是访问物理内存中的数据了。总结起来说,虚拟内存地址的大小是与地址总线位数相关,物理内存地址的大小跟物理内存条的容量相关。

    转自:https://blog.csdn.net/fukaibo121/article/details/75105848
    展开全文
  • 关于内存地址和内存空间的理解

    千次阅读 2018-09-05 15:00:30
    1.内存地址用4位16进制和8位16进制表示的区别。例如经常可以看到某些书籍上写的内存地址0x0001,在另外一些书籍上写的内存地址又变成了0x00000001。都是表示的编号为1的内存地址,为什么一个是4位16进制表示,另外.....
    1.内存地址用4位16进制和8位16进制表示的区别。例如经常可以看到某些书籍上写的内存地址0x0001,在另外一些书籍上写的内存地址又变成了0x00000001。都是表示的编号为1的内存地址,为什么一个是4位16进制表示,另外一个又是用8位16进制表示呢?

    首先,必须要知道内存地址只是一个编号,代表一个内存空间。那么这个空间是多大呢?原来在计算机中存储器的容量是以字节为基本单位的。也就是说一个内存地址代表一个字节(8bit)的存储空间。

    例如经常说32位的操作系统最多支持4GB的内存空间,也就是说CPU只能寻址2的32次方(4GB),注意这里的4GB是以Byte为单位的,不是bit。也就是说有4G=4*1024M(Byte)=4*1024*1024Kb(Byte)=4*1024*1024*1024Byte(8bit),即2的32次方个8bit单位。

    所以说用4位16进制表示的内存地址和用8位16进制表示的内存地址,其实都是代表一个8bit的存储空间而已:

    image

    image

    至于说为什么会出现一种是用4位十六进制表示内存地址,另一种用8位十六进制表示内存地址,那是根据不同的硬件环境来的。个人理解:有些CPU只能寻址16位(16根地址线),所以用4位十六进制表示地址就够用了。有些CPU只能寻址32位(32根地址线),所以用8位十六进制。

    另外记住, 210 = 1024

                 1G  = 1024 M

                 1M  =  1024 KB

                 1KB = 1024 B(Byte)

                 1Byte = 8 bit

    2.理解内存。

    程序和数据平常存储在硬盘等存储器上,不管你开机或关机了,它们都是存在的,不会丢失。硬盘可以存储的东西很多,但其传输数据的速度较慢。所以需要运行程序或打开数据时,这些数据必须从硬盘等存储器上先传到另一种容量小但速度快得多的存储器,之后才送入CPU进行执行处理。这中间的存储器就是内存。

    无论何种存储器,软盘、硬盘、光盘或者内存,都有地址。因为它们要存储数据,所以就必须按一定的单位的数据分配一个地址。有了地址,程序才能找到这些数据。这很好理解,想想你们家为什么要有门牌号即可。

    学习编程,必须对内存的地址有一个透彻的理解。我们编程中的每一行代码,代码中用到的每个数据,都需要在内存上有其映射地址。当然,我们并不需要掌握内存是如何进行编址,那是计算机系中的另外一门课:操作系统的事了。

    内存地址:
    计算机把所有的信息都给数字化了,所以它知道自已把一个数据,一条命令记到了内存中的哪个(些)位置。
    看下面的例子:
    如果让计算机在内存里记住“丁小明”这个名字,可以示意为:

    image

    在第一行中,每一格表示一段内存,而格子里的内容是这段内容记下的数据;第二行中每一格内数字就是对应的内存的地址。
    可能有人会啄磨:为什么一个“丁”字(“小”“明”两字也一样)占用两个内存地址呢?这是因为汉字在一个地址(位置)里呆不下,必须放在连续的两个地址空间内。那么,什么东西可以放在单独的一个内存地址里呢?像英文的里字母,比如’A’, 像阿拉伯数字:比如’1’,可以,而且就是放在一个内存地址里。假设有一字符串“ABC”,被记在内存里,可示意为(这次我们假设从内存地址2000H处记起):

    image

    现在我们提几个问题:

    计算机记住”丁”字的内存地址是多少? 答案是:1000H。请见上图

    我们一直在说,在计算机中,所有信息都被数字化为2进制的0、1,所以,“丁小明”这个名字被也应该是一串:0001 0010 0111 0101……,可是在中图所画出的,计算机内存里记的,仍是“丁小明”三个字啊。

    下面是解释,我们只举一个字”丁”讲解。我们假设在那一串里的 0001 0010 0111 0101 对应的是 “丁” 字,那么有:

    image

    让我们把字母’A’对应的图也画出来:

    image

    在上面的两个图中:

    第一行分别是“丁”和“A”,它是给人看的。

    第二行则是一串的的0和1,这才是计算机内存中实际存储的数据。

    第三行是内存的地址。并不是每个0和1所占的位置都被编上地址。而是每8个才拥有一个地址。

    关于第三行,你可以这样理解,门牌号是一个家庭分配一个,每家每户内还有客厅卧室,这些就没有地址了。

    可见:

    ‘丁’的确是由一串0、1组成的。更确切地,从图上可以看出‘丁’是由16位0和1组成。这16数都存放在2个内存地址里。

    ‘A’也一样,它是由8位0、1组成的。占1个内存地址。

    总结:内存地址是内存当中存储数据的一个标识,并不是数据本身,通过内存地址可以找到内存当中存储的数据。

    展开全文
  • 内存地址空间

    千次阅读 2018-06-01 17:23:23
    如果地址线是32位,那可寻址的范围是4G,内存地址从0-0xffffffff。 BIOS在内存最高地址处,最低1M空间内又很多固定的用途,如下图所示: (图片出自:赵炯——Linux内核完全剖析——基于0.12内核,图2-4) 我...

    如果地址线是32位,那可寻址的范围是4G,内存地址从0-0xffffffff

    BIOS在内存最高地址处,最低1M空间内又有很多固定的用途,如下图所示:
    这里写图片描述
    (图片出自:赵炯——Linux内核完全剖析——基于0.12内核,图2-4)

    我原来不明白,ROM和RAM是连着的吗?还是把ROM BIOS拷贝到RAM中的指定位置。后来看到王爽老师的《汇编语言》才明白,原来上图只是个逻辑存储器,实际是由各类存储器组成的。如下图所示:
    这里写图片描述
    这里写图片描述

    上面的那些存储器,在物理上是独立的器件,但是在以下两点上相同。
    1、都和CPU的总线相连
    2、CPU对它们进行读或写的时候都通过控制线发出内存读写命令。

    这也就是说,CPU在操控它们的时候,把他们都当做内存来对待,把它们总的看做一个由若干存储单元组成的逻辑存储器,这个逻辑存储器也就是我们所说的内存地址空间。

    展开全文
  • 内存地址的概念和理解

    千次阅读 多人点赞 2019-05-29 09:07:24
    都是表示的编号为1的内存地址,为什么一个是4位16进制表示,另外一个又是8位16进制表示呢? 首先,必须要知道内存地址只是一个编号,代表一个内存空间。那么这个空间是多大呢?原来在计算机中存储器的容量是以字节...
  • 关于内存地址的一些理解

    千次阅读 2018-10-11 14:33:28
    首先,必须要知道内存地址只是一个编号,如1000H,代表一个内存空间。在计算机中存储器的容量是以字节为基本单位的。也就是说一个内存地址代表一个字节(8bit)的存储空间。 例如经常说32位的操作系统最多支持4GB的...
  • C++内存地址分配和内存区划分简介

    千次阅读 2018-02-07 11:58:49
    C++内存地址分配和内存区划分简介 原文地址:http://blog.csdn.net/liuhuiyi/article/details/7530137 内存类型简介 内核:在一些系统中,当系统调用发生时,操作系统或者操作系统内核会编程应用程序内存的一...
  • 关于内存地址与内存空间的理解

    千次阅读 2020-04-07 16:01:32
    1.内存地址 内存地址只是一个编号,代表一个内存空间.具体多大呢?...4位16进制表示的内存地址8位16进制表示的内存地址,其实都是代表一个8bit的存储空间而已: 2.理解内存 程序和数据平常存储...
  • 1. 信息在计算机系统中的表示 ...由于计算机内是采用二进制编码表示,因此,在一般情况下,我们“0”表示正号,“1”表示符号,符号位数放在数的最高位。 例如,比如我们十进制数A= +91,B= -91,8位二.
  • 内存地址存储,内存空间

    千次阅读 2018-05-13 11:56:37
    都是表示的编号为1的内存地址,为什么一个是4位16进制表示,另外一个又是8位16进制表示呢?首先,必须要知道内存地址只是一个编号,代表一个内存空间。那么这个空间是多大呢?原来在计算机中存储器的容量是以字节...
  • Java中打印对象内存地址

    万次阅读 多人点赞 2018-06-08 15:48:08
    Object的hashCode()默认是返回内存地址的,但是hashCode()可以重写,所以hashCode()不能代表内存地址的不同System.identityHashCode(Object)方法可以返回对象的内存地址,不管该对象的类是否重写了hashCode()方法。...
  • 什么String 的变量输出不是地址? 因为所有的类继承Object类,所以单独输出一个对象的时候,他会调用Object.toString,打印出来的...关于Java中String内存地址的问题。 在创建String类型的变量的时候建议使用直接赋值
  • Java获取对象内存地址

    千次阅读 2020-10-09 21:50:38
    haseCode()方法获取并非对象内存地址 hashCode方法的主要作用是为了配合基于散列的集合一起正常运行,获取对象散列的地址,并非实际内存地址。 java直接打印对象,结果是十六进制的散列地址值 public class Object...
  • 物理地址指实际存在的物理内存地址,比我有一个2G的内存芯片,那么系统的物理内存就是2G,我要访问该内存中的一个地址,那就需要对应的物理内存。 虚拟地址 虚拟地址,就是就是一种逻辑意义上的地址,而当我们想要...
  • java中如何获取对象的内存地址

    千次阅读 2019-08-01 10:59:02
    java中如何查看对象地址:使用System.identityHashCode(“对象”) 即可 eg: Integer i = new Integer(5); System.identityHashCode(i)
  • 我们都知道结构体的定义: struct Node{  int score;  int age;  char sex; }sqlist;...这样一组结构体定义。...那先说说C语言中定义和声明的区别吧: ... 定义是对声明的实例化,一定会分配内存空间。sqli
  • 一、数据类型 首先必须得明白,在计算机中,任何文件、图片、视频等都是以二进制格式... 举个最简单的例子,你想在计算机中输入一个数15,由于15在二进制中为1111h,那么在计算机中我们就可以4bit的储存空间来...
  • 最近在看书的时候发现程序内存栈是从高地址往低地址分配内存的,而其它的内存地址是从低到高分配内存。 首先,因为栈设计为后进先出的特性(栈需要存储函数中的局部变量和参数,函数又是最后调用的最先销毁,...
  • 在C语言中,指针变量的值就是一个内存地址,&运算符的作用也是取变量的内存地址,请看下面的代码: #include #include int a = 1, b = 255;int main(){ int *pa = &a; printf("pa = %#X, &b = %#X\n", pa, &b);...
  • 物理地址属于比较好理解的,物理地址就是内存中每个内存单元的编号,这个编号是顺序排好的,物理地址的大小决定了内存多少个内存单元,物理地址的大小由地址总线的位宽决定!虚拟地址:虚拟地址是CPU保护模式下的...
  • 内存容量和内存地址

    千次阅读 2018-04-16 10:00:14
    当计算机的地址总线为32时,也就是说该计算机的寻址范围为2^32,即4GB。计算机可以找到4GB个储存单元,但是一个储存单元到底是8位还是16位还是32位,不一定(可能不同的计算机定义不同)八位机一个储存单元就是八位,...
  • 页式地址变换 虚地址结构 ...虚地址转换为内存地址计算 如果,虚地址(逻辑地址、程序地址)以十六进制、八进制、二进制的形式给出 第一步,将虚地址转换成二进制的数; 第二步,按页的大...
  • 什么内存泄漏?有什么危害

    千次阅读 多人点赞 2019-04-18 11:31:56
    1、什么内存泄漏 内存泄漏是指你向系统申请分配内存进行使用(new/malloc),然后系统在堆内存中给这个对象申请一块内存空间,但当我们使用完了却没有归系统(delete),导致这个不使用的对象一直占据内存单元,...
  • 内存地址空间与分配

    千次阅读 2017-11-01 16:25:55
    在32计算机中,它的最大内存容量是2^32次方(4个GB大小)。它是由无符号整形从0~4GB顺序构成。0地址对应一个存储单元(8bit),1地址也对应一个存储单元(8bit),...内存地址指的是RAM的地址,通常16进制表示。
  • gdb 如何调试内存地址

    千次阅读 2017-07-20 09:18:40
    样例代码 int age= 20; int *p_age = &age; NSLog(@"p_age = %p", ... //输出指针变量p_age指向值20所在内存地址 NSLog(@"&p_age = %p", &p_age); //输出指针变量p_age本身的地址 2017-07-19 15:54:07.048 Test07
  • PCIe的内存地址空间、I/O地址空间和配置地址空间

    千次阅读 多人点赞 2018-08-12 18:07:14
    PCIe的内存地址空间、I/O地址空间和配置地址空间 pci设备与其它接口的设备(如i2c设备)最大的不同是存在内存地址空间和配置地址空间,本文分析一下它们的用途。 首先区分一下IO空间和内存空间 cpu会访问的设备...
  • Windows内存体系(1) -- 虚拟地址空间

    万次阅读 多人点赞 2018-03-19 14:07:17
    在8086或者80186以前,要运行一个程序,操作系统会把这些程序全都装入内存,程序都是直接运行在物理内存上的,也就是说程序中访问的内存地址都是实际的物理内存地址。当计算机同时运行多个程序时,必须保证这些程序...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,671,448
精华内容 668,579
关键字:

内存地址有什么用