zoukankan      html  css  js  c++  java
  • (读书笔记)内存对齐,移位运算

    一,内存对齐

    1,分析需不需要对齐,只需要看到底会不会影响访问次数。

    2,内存对齐是一种典型的空间换时间的方法。

    3,对齐的原则是: 1)结构体变量的首地址能够被其最宽基本类型成员的大小所整除; 2)结构体每个成员相对于结构体首地址的偏移量(offset)都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节(internal adding); 3)结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节。

    struct SByte1  
    {  
        double d;    // 偏移量0~7  
        char j;      // 偏移量8  
        int a;       // 偏移量12~15,由于9不能整除4,故先填充9~11  
    };   
    sizeof(SByte1);  // = 16  
      
    struct SByte2  
    {        
        char j;      // 偏移量0  
        double d;    // 偏移量8~15,由于1不能整除8,故先填充1~7  
        int a;       // 偏移量16~19  
    };   
    sizeof(SByte2);  // = 24,为了凑成8的倍数,填充20~23
    二,移位运算
    1,左移:丢弃最高位,0补最低位,左移里一个比较特殊的情况是当左移的位数超过该数值类型的最大位数时,编译器会用左移的位数去模类型的最大位数,然后按余数进行移
    右移:丢弃低位,符号位补高位
    2,看一段代码,如下。

    #include<stdio.h>
    int main()
    {
    int a=31;
    int b=0xffffffff;
    printf("the first%d\n",0xffffffff>>31);
    printf("the second%d\n",b>>31);
    printf("the third%d\n",0xffffffff>>a);
    printf("%x",b);
    return 0;
    }                                                                                                                   
    输出结果:the first1
    the second-1
    the third1
    说明:0xffffffff是被当作无符号数看待,int b是有符号数


  • 相关阅读:
    Android 禁用以及捕捉home键
    android中正确导入第三方jar包
    使用SharedPreferences进行数据存储
    tomcat不安全因素
    spring边边角角
    宏定义
    C++变量对比java变量所占内存
    结构指针的分析
    对结构使用指针
    什么是程序文件?
  • 原文地址:https://www.cnblogs.com/ymy124/p/2300346.html
Copyright © 2011-2022 走看看