当前位置: 首页 > news >正文

转载: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))

转载于:https://www.cnblogs.com/liaokang/p/6179434.html

相关文章:

  • codewars020: The Clockwise Spiral 数字顺时针螺旋矩阵
  • Servlet引擎Jetty之入门1
  • PHP SPL中提供了SplFileInfo和SplFileObject两个类来处理文件操作。
  • pg_dump实例详解(备份postgresql和greenplum数据库)
  • GATK使用说明(一)
  • linux应用之apache的源码安装(centos)
  • linux sudo 命令
  • 客户端Socket
  • 一张图看懂开源许可协议,开源许可证GPL、BSD、MIT、Mozilla、Apache和LGPL的区别...
  • 画风清奇!盘点各编程语言中有趣的开源项目!
  • 前端学HTTP之报文首部
  • 【干货分享】流程DEMO-制度发文和干部任免
  • [充电]多线程无锁编程--原子计数操作:__sync_fetch_and_add等12个操作
  • Conversion to Dalvik format failed: Unable to execute dex: Multiple dex files define ...
  • 安装logstash,elasticsearch,kibana三件套
  • [ 一起学React系列 -- 8 ] React中的文件上传
  • 「译」Node.js Streams 基础
  • 【vuex入门系列02】mutation接收单个参数和多个参数
  • 【个人向】《HTTP图解》阅后小结
  • Apache Pulsar 2.1 重磅发布
  • CAP 一致性协议及应用解析
  • css选择器
  • ECS应用管理最佳实践
  • fetch 从初识到应用
  • Git同步原始仓库到Fork仓库中
  • HTTP传输编码增加了传输量,只为解决这一个问题 | 实用 HTTP
  • Javascript基础之Array数组API
  • Python3爬取英雄联盟英雄皮肤大图
  • Vue UI框架库开发介绍
  • 阿里云容器服务区块链解决方案全新升级 支持Hyperledger Fabric v1.1
  • 机器学习中为什么要做归一化normalization
  • 老板让我十分钟上手nx-admin
  • 容器服务kubernetes弹性伸缩高级用法
  • 设计模式(12)迭代器模式(讲解+应用)
  • 首页查询功能的一次实现过程
  • 腾讯大梁:DevOps最后一棒,有效构建海量运营的持续反馈能力
  • 移动端解决方案学习记录
  • 源码安装memcached和php memcache扩展
  • 字符串匹配基础上
  • 翻译 | The Principles of OOD 面向对象设计原则
  • 通过调用文摘列表API获取文摘
  • ​学习一下,什么是预包装食品?​
  • (Python第六天)文件处理
  • (二)hibernate配置管理
  • (附源码)ssm捐赠救助系统 毕业设计 060945
  • (介绍与使用)物联网NodeMCUESP8266(ESP-12F)连接新版onenet mqtt协议实现上传数据(温湿度)和下发指令(控制LED灯)
  • (九)信息融合方式简介
  • (理论篇)httpmoudle和httphandler一览
  • (每日持续更新)jdk api之FileFilter基础、应用、实战
  • (三)docker:Dockerfile构建容器运行jar包
  • (一)ClickHouse 中的 `MaterializedMySQL` 数据库引擎的使用方法、设置、特性和限制。
  • (原创)boost.property_tree解析xml的帮助类以及中文解析问题的解决
  • (转)IIS6 ASP 0251超过响应缓冲区限制错误的解决方法
  • (转)Linux NTP配置详解 (Network Time Protocol)
  • (转)Scala的“=”符号简介