• (读书笔记)内存对齐,移位运算


    一,内存对齐

    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是有符号数


  • 相关阅读:
    上云,你真的只差一本葵花宝典
    Linux Kernel 4.11首个候选版本开放下载
    Windows 10 host where Credential Guard or Device Guard is enabled fails when running Workstation (2146361)
    .NET技术+25台服务器怎样支撑世界第54大网站
    Azure 订阅和服务限制、配额和约束
    python再议装饰器
    python的上下文管理器-1
    python的上下文管理器
    python小知识点
    python做简易记事本
  • 原文地址:https://www.cnblogs.com/ymy124/p/2300346.html
Copyright © 2020-2023  润新知