zoukankan      html  css  js  c++  java
  • 向上取整算法

    在进行内存分配的时候一般都需要在实际使用内存大小的基础上进行内存对齐,比如一般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)
    

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

  • 相关阅读:
    CentOS部署ElasticSearch7.6.1集群
    Linux安装Elasticsearch7.x
    ElasticSearch安装为Windows服务
    SolrNet Group分组 实现
    ubuntu 下安装sublime
    LeetCode 3: Longest Substring Without Repeating Characters
    LeetCode 179: Largest Number
    LeetCode 1: Two Sum
    LeetCode 190: Reverse Bits
    LeetCode 7: Reverse Integer
  • 原文地址:https://www.cnblogs.com/lanuage/p/8001378.html
Copyright © 2011-2022 走看看