在C的世界中,因为要考虑效率问题,所以在申请一段内存的时候,需要根据寄存器的宽度进行对齐。因此,对于32位的程序,按照4字节对齐;对于64位的程序,则按照8字节对齐。

o 下面使用位运算给出实现:

1 #define align4(x) (((((x)-1)>>2)<<2)+4)
2 #define align8(x) (((((x)-1)>>3)<<3)+8)

o 用Python代码简单实现并验证一下:

 1 #!/usr/bin/python
 2
 3 """ alignN(x) is often used by malloc(3C), here is a simple implementation """
 4
 5 import sys
 6
 7 def align4(x): return (((((x)-1)>>2)<<2)+4)
 8 def align8(x): return (((((x)-1)>>3)<<3)+8)
 9
10 def main(argc, argv):
11     if argc != 2:
12         return 1
13     for i in range(0, int(argv[1])+1):
14         print "%2d\t%2d\t%2d" % (i, align4(i), align8(i))
15     return 0
16
17 if __name__ == '__main__':
18     argc, argv = len(sys.argv), sys.argv
19     sys.exit(main(argc, argv))

o 测试

$ ./foo.py 160     0     01     4     82     4     83     4     84     4     85     8     86     8     87     8     88     8     89    12    16
10    12    16
11    12    16
12    12    16
13    16    16
14    16    16
15    16    16
16    16    16

最后,以8字节对齐讲解其实现原理。

设x = 8 * a + b, 0 <= b <= 7, x为申请的内存size。

(1) 如果b=0, 则x = 8 * a。因此,x的低3位不需要被清零;

(2) 如果1<=b<=7, 则x应该为8 * (a+1)。因此,直接将x的低3位清零并加8即可,那么x = (x >> 3) << 3 + 8;

为统一(1)和(2), 分两步走:

1. x = x - 1;  /* if x mod 8 == 0, 则新x的低3位为7; if x mod 8 == 1, 则新x的低3位为0 */

2. x = (x >> 3) << 3 + 8; /* 将低3位清零,然后统一加上8,搞定! */

扩展阅读:

  • Data alignment: Straighten up and fly right

转载于:https://www.cnblogs.com/idorax/p/6401588.html

用位运算实现内存对齐相关推荐

  1. c++ 对象起始地址 指针靠齐_Go的内存对齐和指针运算详解和实践

    uintptr 和 unsafe普及 uintptr 在Go的源码中uintptr的定义如下: /* uintptr is an integer type that is large enough t ...

  2. 我眼中的 Nginx(一):Nginx 和位运算

    作者张超:又拍云系统开发高级工程师,负责又拍云 CDN 平台相关组件的更新及维护.Github ID: tokers,活跃于 OpenResty 社区和 Nginx 邮件列表等开源社区,专注于服务端技 ...

  3. 基于STM32使用嵌套结构体摸索内存对齐

    导读 一.结构体的声明以及初始化 二.结构体成员的内存对齐规则 三.联合体以及嵌套结构体的用法 位段 小端模式 三.位段数据跨字节单位导致的内存对齐现象 用来描述对象特征的各类信息,通常会被整合成记录 ...

  4. 计算机语言mod(m n),关于一段地址对齐的位运算代码的解释

    #define _INTSIZEOF(n) ((sizeof(n)+sizeof(int)-1)&~(sizeof(int) - 1) ) //为了满足需要内存对齐的系统 这段代码有些难以理解 ...

  5. Eigen向量化内存对齐/Eigen的SSE兼容,内存分配/EIGEN_MAKE_ALIGNED_OPERATOR_NEW

    1.总结 对于基本数据类型和自定义类型,我们需要用预编译指令来保证栈内存的对齐,用重写operator new的方式保证堆内存对齐.对于嵌套的自定义类型,申请栈内存时会自动保证其内部数据类型的对齐,而 ...

  6. C++位运算详解(转)

    位运算是对表示数据的基本单元进行"加和","减除"的方法. 首先一个位(bit)单位就是0或1,硬件表示就是一个肪冲的开和,这是硬软通迅最基本的单元.我们所说的 ...

  7. C语言内存编址和寻址、内存对齐

    内存编址和寻址.内存对齐 内存的编址方法 关键:内存编址是以字节为单位的 内存和数据类型的关系 内存对齐 内存的编址方法 在程序运行时,计算机中CPU实际只认识内存地址,而不关心这个地址所代表的空间在 ...

  8. Go 内存对齐的那些事儿

    在讨论内存对齐前我们先看一个思考题,我们都知道Go的结构体在内存中是由一块连续的内存表示的,那么下面的结构体占用的内存大小是多少呢? type ST1 struct {A byteB int64C b ...

  9. 大小端、位段和内存对齐

    关于C++中的大小端.位段(惑位域)和内存对齐 来源: ♂戚建建㊣的日志 听到好几个朋友说到去一些公司做面试,总是遇到关于大小端.位段(或者叫位域)和内存对齐的考题,然后就不知所措了.虽然我认为很多开 ...

  10. 怎么调试内存溢出的c++代码_【C/C++】内存对齐 到底怎么回事?

    1 明确几个概念 代码分区:在使用C/C++编程时,我们定义的变量存在于内存中,而内存在C语言的角度上可以分为五大区.局部变量在栈区,静态/全局变量在全局区,动态申请的变量存在于堆区,const修饰的 ...

最新文章

  1. CMS模板应用调研问卷
  2. php 头像拼图,php 有趣的头像拼图
  3. thinkphp 助手函数url不生成https_如何用ThinkPHP框架写一个快递查询接口
  4. tomcat8日志乱码_Tomcat输出日志乱码解决
  5. Apache和Nginx下禁止访问特定的目录或文件
  6. 机器学习降维-深度AI科普团队
  7. 使用MegaCli工具,在线调整raid配置
  8. Linux中usb设置burst,Re: 关于IMX6UL第二个USB接口在linux驱动的问题
  9. 1.深入分布式缓存:从原理到实践 --- 缓存为王
  10. OpenCV_轮廓例子
  11. 300+篇CVPR 2020代码开源的论文(转载)
  12. JavaSE|StringBuffer
  13. 小猫爪:PMSM之FOC控制04-SVPWM
  14. 图像分割python代码_SILC超像素分割算法详解(附Python代码)
  15. 黑客X档案 2008~2012 NPM、PYPI、DockerHub 备份
  16. 设计模式(一) 简单工厂模式
  17. ​【火星传媒报道】李笑来归来:不做韭菜的生意
  18. 成为一个好的PHP工程师需要掌握什么技能
  19. 贪吃蛇python游戏
  20. ubuntu自带Firefox安装flash插件

热门文章

  1. 【渝粤题库】陕西师范大学292231 财务管理Ⅱ 作业(专升本)
  2. 机器博弈 (三) 虚拟遗憾最小化算法
  3. Linux系统(一)文件和目录理解
  4. 1.1 c和c++关系
  5. 新建Scrapy项目
  6. Go语言学习之8 goroutine详解、定时器与单元测试
  7. vue(组件、路由)懒加载
  8. 令人赞叹的 MySQL
  9. canvas的beginPath和closePath分析总结,包括多段弧的情况
  10. display:block jquery.sort()