• 向上取整算法


    在进行内存分配的时候一般都需要在实际使用内存大小的基础上进行内存对齐,比如一般32位平台进行4字节对齐,而64位平台使用8字节对齐等等。
    一般采用的算法是先利用公式
    $int(frac{a + b - 1} { b})$(其中a是实际使用的内存, b是对齐值)
    然后根据这个值乘以b即可得到对应的对齐值

    公式推导

    $$ 假设 A = NB +M (M in left[0,B-1 ight])$$

    $$ecausefrac{A}{B} = N + frac{M}{B}$$

    $$ecause M inleft[0, B-1 ight]$$

    $$ herefore frac{A}{B} leq frac{NB +B -1}{B} leq frac{A + B -1}{B}$$

    从上面可以得出$$frac{A}{B}$$向上取整可能是int($$frac{A+B-1}{B}$$)但是具体是否有比它小的整数,仍然不能确定.因此我们根据推导一下这个结果与$$frac{A}{B}$$向上取整的结果是否相同

    $$ 假设 A = NB +M (M in left[0,B-1 ight])$$

    $$当M = 0时UP(frac{A}{B}) = N$$

    $$当M eq 0时,UP(frac{A}{B}) = N$$

    而针对int($$frac{A+B-1}{B}$$)的结果

    $$当M = 0时int(frac{A+B-1}{B} )=int(frac{NB+B -1}{B}) = int(N + 1 - frac{1}{B}) $$

    $$ecause frac{1}{B} < 1$$

    $$ herefore int(frac{A+B-1}{B} )$$

    $$当 M eq 0 时int(frac{A+B-1}{B} ) = int(frac{NB +M + B -1}{B}) = int(N + 1 + frac{M-1}{B})$$

    $$当M = 1时 int(frac{A+B-1}{B} ) = int(N + 1 + frac{M-1}{B}) = N + 1$$

    $$当1 < M leq B-1时 frac{M -1}{B} < 1$

    $ herefore int(frac{A+B-1}{B} ) = int(N + 1 + frac{M-1}{B}) = N$$

    从上面的推导来看二者的值完全相同所以可以得出结论

    $$UP(frac{A}{B}) = int(frac{A + B - 1}{B})$$

    所以当我们对A字节的内存进行B字节的对齐时可以使用公式

    $$int(frac{A + B - 1}{B}) imes B $$

    补充

    其实还有一个算法

    long(A + B - 1) &~ (B - 1)
    

    也可以计算,但是我没有弄清楚它的原理是什么,暂时不管先记住再说_
    这里对数学公式的支持不太好,如果想看完整的点击这里

  • 相关阅读:
    大数据经典学习路线(及供参考)
    Redis配置规范
    mysql中datetime和timestamp类型的区别
    bigint(10)和bigint(20)的区别
    Redis分布式锁,基于StringRedisTemplate和基于Lettuce实现setNx
    Spring security UserDetailsService autowired注入失败错误
    Java Print 打印
    Spring boot Junit Test单元测试
    RESTful作用与特性
    JS匿名函数理解
  • 原文地址:https://www.cnblogs.com/lanuage/p/8001378.html
Copyright © 2020-2023  润新知