zoukankan      html  css  js  c++  java
  • 内存中的数据对齐

    为什么数据需要内存对齐?

    1 平台原因

      不是所有的硬件平台都能访问任意内存地址上的任意数据,某些硬件平台只能在某些地址处取某些特定类型的数据,

    否则抛出硬件异常。为了同一个程序可以在多平台运行,需要内存对齐。

    2 硬件原因

      经过内存对齐后,CPU访问内存的速度大大提升。

      

    为什么经过内存对齐后,CPU访问内存的速度大大提升?

      CPU读取内存不是一次读取单个字节,CPU把内存当作一块一块的,块的大小可以是2,4,8,16个字节。

    因此CPU在读取内存时是一块一块进行读取的。

      假设CPU把内存划分为4字节大小的块,要读取一个4字节大小的int型数据,分二种情况:

    1 该int数据从地址0开始

      此时,直接将地址0,1,2,3处的四个字节数据读取到即可

    2 该int数据从地址1开始

      ①CPU读取0,1,2,3处的四个字节数据

      ②CPU读取4,5,6,7处的四个字节数据

      ③合并地址1,2,3,4处的四个字节数据为一个int数据

    看到该int数据如果没有从地址1开始的话会大大降低CPU的性能。

    不同的编译器的对齐方式:

    用如下代码分别在VC,和DEV C++编译器上执行。

    #include<stdio.h>

    int main()

    {

      int a;

      char b;

      int c;

      printf("0x%08X ", &a);

      printf("0x%08X ", &b);

      printf("0x%08X ", &c);

      return 0;

    }

    VC执行结果:

    看到a占用 ff7c开始的4字节,b占用ff7b一个字节,c占用ff80开始的4字节

    DEV C++执行结果:

     

    a占用ff7c开始的4字节,c占用ff74开始的4字节,ff78开始的到ff7b的4字节被b占用了

      可以看到,不同的编译器的对齐方式是不同的。

  • 相关阅读:
    Asp.net MVC中表单验证属性的使用
    asp.net mvc3用file上传文件大小限制问题
    Asp.net MVC中ReturnUrl的使用
    Asp.net mvc+EF+Sql Server2008数据库缓存依赖
    .Net有哪些大型项目、大型网站的案例?
    Canvas 继续学习
    React 表单与事件
    React Ajax
    React生命周期
    React 添加一个事件
  • 原文地址:https://www.cnblogs.com/fengxing999/p/10919141.html
Copyright © 2011-2022 走看看