zoukankan      html  css  js  c++  java
  • 转载:align

    1. 原理
        int a;
        int size = 8;        <----> 1000(bin)
    计算a以size为倍数的下界数:
        就让这个数(要计算的这个数)表示成二进制时,最后三位为0就可以达到这个目标。只要下面这个数与a进行"与运算"就可以了:
        11111111 11111111 11111111 11111000
        而上面这个数实际下就是 ~(size - 1),可以将该数称为size的对齐掩码size_mask.
    计算a以size为倍数的上下界数:
        #define alignment_down(a, size) (a & (~(size-1)) )
        #define alignment_up(a, size)   ((a+size-1) & (~ (size-1)))
        注: 上界数的计算方法,如果要求出比a大的是不是需要加上8就可以了?可是如果a本身就是8的倍数,这样加8不就错了吗,所以在a基础上加上(size - 1), 然后与size的对齐掩码进行与运算.
        例如:
        a=0, size=8, 则alignment_down(a,size)=0, alignment_up(a,size)=0.
        a=6, size=8, 则alignment_down(a,size)=0, alignment_up(a,size)=8.
        a=8, size=8, 则alignment_down(a,size)=8, alignment_up(a,size)=8.
        a=14, size=8,则alignment_down(a,size)=8, alignment_up(a,size)=16.
        注:size应当为2的n次方, 即2, 4, 8, 16, 32, 64, 128, 256, 1024, 2048, 4096 ...
    2. 在linux中的应用
        上面的计算方法在linux等代码中也常常可以看到,下面给出几个例子:
        (1) 当分配地址addr时, 要将该地址以size为倍数对齐, 而且要得到是比addr大的值, 则使用_ALIGN宏:
        #define _ALIGN(addr,size) (((addr)+(size)-1)&(~((size)-1)))
        (2) 与页面对齐相关的宏
        #define PAGE_SIZE         4096
        #define PAGE_MASK         (~(PAGE_SIZE-1))
        #define PAGE_ALIGN(addr) -(((addr)+PAGE_SIZE-1) & PAGE_MASK)
        (3) 与skb分配时对齐相关的宏
        #define SKB_DATA_ALIGN(X) (((X) + (SMP_CACHE_BYTES - 1)) & ~(SMP_CACHE_BYTES - 1))

  • 相关阅读:
    python json 和 pickle的补充 hashlib configparser logging
    go 流程语句 if goto for swich
    go array slice map make new操作
    go 基础
    块级元素 行内元素 空元素
    咽炎就医用药(慢性肥厚性咽炎)
    春季感冒是风寒还是风热(转的文章)
    秋季感冒 咳嗽 怎么选药
    解决IE浏览器“无法显示此网页”的问题
    常用的 css 样式 记录
  • 原文地址:https://www.cnblogs.com/liaokang/p/6179434.html
Copyright © 2011-2022 走看看