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占用了

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

  • 相关阅读:
    doges
    Unity Fps示例
    使用Unity的2D功能开发弹球游戏
    Unity UGUI 原理篇(二):Canvas Scaler 縮放核心
    UGUI 深度優化提升手遊效能
    关于Unity中的UGUI优化,你可能遇到这些问题
    git branch --set-upstream 本地关联远程分支
    git rm 与 git reset
    Git笔记之初识vi编辑器
    [内容分享]粗略判断Shader每条代码的成本
  • 原文地址:https://www.cnblogs.com/fengxing999/p/10919141.html
Copyright © 2011-2022 走看看