zoukankan      html  css  js  c++  java
  • 内存编址和寻址、内存对齐

    内存编址方式

    1.内存在逻辑上就是一个一个的格子,这些格子可以用来装东西,也就是内存中的数据,每个格子都有一个固定的编号,这个编号0、1、2、3就是
    内存地址,这个内存地址(一个数字)和这个格子的空间是一一对应的并且是永久绑定的。这就是内存的编址方式
    2.在程序运行时,CPU只认识内存地址,而不关心这个地址所代表的空间在哪里以及分布,因为硬件的设计保证了只要有地址,就一定能找到这个盒子在
    哪里,所以内存单元有两个概念:地址和空间
    3.内存编址是以字节为单位,每一个内存地址对应的内存大小的空间是固定的,就是一个字节8bit

    内存寻址方式

    1.逻辑地址:包含在机器语言指令中用来指定一个操作数或者一条指令的地址
    2.线性地址(也称虚拟地址):是一个32位无符号整数,可以用来表示高达4G的地址,通常使用16进制数来表示,范围从0x00000000到0xffffffff
    3.物理地址:用于内存芯片级内存单元寻址,他们从微处理器的地址引脚发送到内存总线上的电信号相对应。物理地址由32位或36位无符号整数表示

    MMU

    MMU内存管理单元)的功能是将逻辑地址转换为物理地址,其中包括:
    1.分页单元,将逻辑地址转换为线性地址
    2.分页单元,将线性地址转换为物理地址

    内存对齐

    typedef abc{
        char a;
        short b;
        int c;
    }
    
    typedef my{
        char a;
        int c;
        short b;
    }
    

    sizeof(abc)=8而sizeof(my)=12????为什么会产生这种问题呢

    为什么要内存对齐

    1.平台原因(移植原因):不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。

    2.性能原因:数据结构(尤其是栈)应该尽可能地在自然边界上对齐。原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;而对齐的内存访问仅需要一次访问。

  • 相关阅读:
    c#中out与ref的用法与区别
    一次不该出现的bug
    js弹出蒙版
    foreach中不能修改元素的值
    C#中使用正则表达式来过滤html字符
    细微之处才能显示水平
    js画直线 拓荒者
    XSLT模板转换XML文档 拓荒者
    怪异的JavaScript Date对象 拓荒者
    [转]C++ 笔记点滴 拓荒者
  • 原文地址:https://www.cnblogs.com/hyxk/p/11896393.html
Copyright © 2011-2022 走看看