zoukankan      html  css  js  c++  java
  • 内存地址对齐方式

    对齐的作用和原因:各个硬件平台对存储空间的处理上有很大的不同。一些平台对某些特定类型的数据只能从某些特定地址开始存取。其他平台可能没有这种情况, 但是最常见的是如果不按照适合其平台的要求对数据存放进行对齐,会在存取效率上带来损失。比如有些平台每次读都是从偶地址开始,如果一个int型(假设为 32位)如果存放在偶地址开始的地方,那么一个读周期就可以读出,而如果存放在奇地址开始的地方,就可能会需要2个读周期,并对两次读出的结果的高低 字节进行拼凑才能得到该int数据。显然在读取效率上下降很多。这也是空间和时间的博弈。

    struct A 
    {
    	char c;
    	int a;
    	short b;	
    };
    
    struct B 
    {
    	int a;
    	short b;
    	char c;
    };
    struct C 
    {
    	int a;
    	short b;
    	char c;
    	double d;
    };
    struct D 
    {
    	int a;
    	short b;
    	char c;
    	float d;
    };
    struct E 
    {
    	int a;
    	short b;
    	char c;
    	long d;
    };


    上面的结构体的大小为:



    于char型数据,其自身对齐值为1,对于short型为2,对于int,float,long,类型,其自身对齐值为4,double类型,其自身对齐值为8,单位字节。
    这里面有四个概念值:
    1)数据类型自身的对齐值:就是上面交代的基本数据类型的自身对齐值。
    2)指定对齐值:#pragma pack (value)时的指定对齐值value。
    3)结构体或者类的自身对齐值:其成员中自身对齐值最大的那个值。
    4)数据成员、结构体和类的有效对齐值:自身对齐值和指定对齐值中较小的那个值。
          有效对齐值N是最终用来决定数据存放地址方式的值,最重要。有效对齐N,就是表示“对齐在N上”,也就是说该数据的"存放起始地址%N=0".而数据结构中的数据变量都是按定义的先后顺序来排放的。第一个数据变量的起始地址就是 数据结构的起始地址。结构体的成员变量要对齐排放,结构体本身也要根据自身的有效对齐值圆整(就是结构体成员变量占用总长度需要是对结构体有效对齐值的整 数倍)。

  • 相关阅读:
    编码
    TCP
    Http
    信息安全
    https基本原理
    Android之ListView异步加载图片且仅显示可见子项中的图片
    android 一些数据转换方法
    Android 关于 OnScrollListener 事件顺序次数的简要分析
    图片的内存缓存控制
    Android实现图片宽度100%ImageView宽度且高度按比例自动伸缩
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3249338.html
Copyright © 2011-2022 走看看