• 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中;

     

  • 相关阅读:
    WCF+Silverlight 制作一个简单RSS的阅读器(一)
    将Ironpython嵌入到你的程序中
    今天修改了网页
    开发小议
    Silverlight 可以支持windows2000了
    昨天晚上开始寻找圣诞的素材了
    需要每天的坚持!
    今天开始学习ADO.NET中的Connection对象(一)SqlConnection对象连接SQL Server
    一个基于Ajax简单的数据验证
    《微软:DirectShow开发指南》第4章 Capturing Audio with DirectShow
  • 原文地址:https://www.cnblogs.com/wjcdx/p/11816082.html
Copyright © 2020-2023  润新知