zoukankan      html  css  js  c++  java
  • Rocket

    https://mp.weixin.qq.com/s/poCJBcx45clXHm6Uuv8M6w

     

    介绍AddressSet.misaligned的实现。之前介绍的比较概括,也有偏差。这里根据实际执行结果,分析总结其功能。

     

     

    1. 提取执行

     

    misaligned功能比较独立,可以单独提取出来。执行观察运行结果,或者调试跟踪来观察其功能。

    其中,需要解决的依赖是log2Floor。

     

    执行结果如下:

     

    2. 基本功能

     

    misaligned的基本功能是把从base开始的size个地址,按照对齐原则,使用最少的基址/掩码对表示。

     

    从上面的例子可以看出:

     

    1) misaligned(0,4)

     

    从0开始的4个地址,可以直接使用两位掩码进行表示,即(0,3=0b11);

     

    2) misaligned(1,4)

     

    从1开始的4个地址中:

    a. 地址1=0b001最大对齐范围是1个地址,所以只能独自作为一个表示(1,0=0b0);

    b. 地址2=0b010最大对齐范围是2个地址,由于还有三个地址没表示,可以把这两个地址包含在内,所以可以使用其表示为(2,1=0b1)。包含两个地址,即地址2和地址3;

    c.地址4=0b100最大对齐范围就是4个地址,但是size中未表示的还有一个地址,所以只能使用表示(4,0=0b0)表示一个地址,即地址4;

     

    3) misaligned(2,4)

     

    a. 地址2=0b010最大对齐范围是2个地址,(2, 1=0b1)表示2个地址,即地址2和地址3;

    b. 地址4=0b100最大对齐范围是4个地址,但size中未表示的地址还有2个,所以使用(4,1=0b1)表示2个地址,即地址4和地址5;

     

    4) misaligned(3,4)

     

    a. 地址3=0b011最大对齐范围是1个地址,只能独自使用一个表示(3,1=0b1);

    b. 地址4=0b100最大对齐范围是4个地址,但size中未表示的地址还有3个,这3个地址无法使用一个掩码全部表示,所以使用(4,1=0b1)表示2个地址,即地址4和地址5;余下一个地址6另外表示;

    c. 地址6=0b110最大地址范围是2个地址,但size中未表示的地址只有1个,所以使用(6,0=0b0)来表示这一个地址,即地址6;

     

    3. 简单分析

     

    a. 这是一个递归函数,如果size=0,即没有地址需要表示,则直接返回tail;tail中包含已经生成的基址/掩码对表示;

    b. maxBaseAlignment表示基址允许的最大对齐地址数(这里取的是base的最低值为1的位);

    c. maxSizeAlignment表示size中可以不多不少完整被一个基址/掩码对表示的地址数,这里取最高位。比如6=0b110,需要被分为4个和2个,两次对齐表示;

    d. 从两个值中取较小的一个作为这一步向前跨出的地址数(step);

    e. base+step:向前跨过step个地址;

    f. size-step:地址数减少step个;

    g. (base, step-1)作为基址/掩码对加入tail中;

     

  • 相关阅读:
    61. 最长不含重复字符的子字符串
    60. 礼物的最大价值 (未理解)
    59. 把数字翻译成字符串
    58. 把数组排成最小的数
    57. 数字序列中某一位的数字 (不懂)
    spring data jpa 官方文档
    idea 编译报错 源发行版 1.8 需要目标发行版 1.8
    idea maven 依赖报错 invalid classes root
    solr
    spring boot 官方文档
  • 原文地址:https://www.cnblogs.com/wjcdx/p/11816082.html
Copyright © 2011-2022 走看看