用位运算实现内存对齐
在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
用位运算实现内存对齐相关推荐
- c++ 对象起始地址 指针靠齐_Go的内存对齐和指针运算详解和实践
uintptr 和 unsafe普及 uintptr 在Go的源码中uintptr的定义如下: /* uintptr is an integer type that is large enough t ...
- 我眼中的 Nginx(一):Nginx 和位运算
作者张超:又拍云系统开发高级工程师,负责又拍云 CDN 平台相关组件的更新及维护.Github ID: tokers,活跃于 OpenResty 社区和 Nginx 邮件列表等开源社区,专注于服务端技 ...
- 基于STM32使用嵌套结构体摸索内存对齐
导读 一.结构体的声明以及初始化 二.结构体成员的内存对齐规则 三.联合体以及嵌套结构体的用法 位段 小端模式 三.位段数据跨字节单位导致的内存对齐现象 用来描述对象特征的各类信息,通常会被整合成记录 ...
- 计算机语言mod(m n),关于一段地址对齐的位运算代码的解释
#define _INTSIZEOF(n) ((sizeof(n)+sizeof(int)-1)&~(sizeof(int) - 1) ) //为了满足需要内存对齐的系统 这段代码有些难以理解 ...
- Eigen向量化内存对齐/Eigen的SSE兼容,内存分配/EIGEN_MAKE_ALIGNED_OPERATOR_NEW
1.总结 对于基本数据类型和自定义类型,我们需要用预编译指令来保证栈内存的对齐,用重写operator new的方式保证堆内存对齐.对于嵌套的自定义类型,申请栈内存时会自动保证其内部数据类型的对齐,而 ...
- C++位运算详解(转)
位运算是对表示数据的基本单元进行"加和","减除"的方法. 首先一个位(bit)单位就是0或1,硬件表示就是一个肪冲的开和,这是硬软通迅最基本的单元.我们所说的 ...
- C语言内存编址和寻址、内存对齐
内存编址和寻址.内存对齐 内存的编址方法 关键:内存编址是以字节为单位的 内存和数据类型的关系 内存对齐 内存的编址方法 在程序运行时,计算机中CPU实际只认识内存地址,而不关心这个地址所代表的空间在 ...
- Go 内存对齐的那些事儿
在讨论内存对齐前我们先看一个思考题,我们都知道Go的结构体在内存中是由一块连续的内存表示的,那么下面的结构体占用的内存大小是多少呢? type ST1 struct {A byteB int64C b ...
- 大小端、位段和内存对齐
关于C++中的大小端.位段(惑位域)和内存对齐 来源: ♂戚建建㊣的日志 听到好几个朋友说到去一些公司做面试,总是遇到关于大小端.位段(或者叫位域)和内存对齐的考题,然后就不知所措了.虽然我认为很多开 ...
- 怎么调试内存溢出的c++代码_【C/C++】内存对齐 到底怎么回事?
1 明确几个概念 代码分区:在使用C/C++编程时,我们定义的变量存在于内存中,而内存在C语言的角度上可以分为五大区.局部变量在栈区,静态/全局变量在全局区,动态申请的变量存在于堆区,const修饰的 ...
最新文章
- CMS模板应用调研问卷
- php 头像拼图,php 有趣的头像拼图
- thinkphp 助手函数url不生成https_如何用ThinkPHP框架写一个快递查询接口
- tomcat8日志乱码_Tomcat输出日志乱码解决
- Apache和Nginx下禁止访问特定的目录或文件
- 机器学习降维-深度AI科普团队
- 使用MegaCli工具,在线调整raid配置
- Linux中usb设置burst,Re: 关于IMX6UL第二个USB接口在linux驱动的问题
- 1.深入分布式缓存:从原理到实践 --- 缓存为王
- OpenCV_轮廓例子
- 300+篇CVPR 2020代码开源的论文(转载)
- JavaSE|StringBuffer
- 小猫爪:PMSM之FOC控制04-SVPWM
- 图像分割python代码_SILC超像素分割算法详解(附Python代码)
- 黑客X档案 2008~2012 NPM、PYPI、DockerHub 备份
- 设计模式(一) 简单工厂模式
- ​【火星传媒报道】李笑来归来:不做韭菜的生意
- 成为一个好的PHP工程师需要掌握什么技能
- 贪吃蛇python游戏
- ubuntu自带Firefox安装flash插件