内存对齐

比如一个内存单元的长度为2,为了存取方便我们应该尽量把数据放在2的倍数的位置上(如位置0,2,4,6等),此时称该数据的位置是与某个值(2)对齐的。如果放在了没对齐的地方(比如位置3)上,该数据可能跨过了一次能读取的跨度,就必须读两次才行。

为了杜绝这种低效行为,我们使用一个函数ROUNDUP(n, size)来对原地址n进行修改,从而实现内存对齐。

举个例子,ROUNDUP(9,2)=10,也就是把本来的位置9改成对齐到位置10。

其算法通常是这样的: #define ROUNDUP(x,n) ((x+(n-1))&(~(n-1))),n为对齐的大小

下面对该算法进行一下解释

我们知道,对于两个正整数 x, n 总存在整数 q, r 使得

x = nq + r, 其中  0<= r <n                  //最小非负剩余表示法

q, r 是唯一确定的。q = [x/n], r = x - n[x/n]. 这个是我们所熟悉的带余除法的一个简单形式。在 c 语言中, q, r 容易计算出来: q = x/n, r = x % n.

所谓把 x 按 n 对齐指的是:若 r=0, 取返回值为qn, 若 r>0, 取 (q+1)n.

这也相当于把 x 表示为:

x = nq + r', 其中 -n < r' <=0                //最大非正剩余表示法

nq 是我们所求。关键是如何用 c 语言计算它。由于我们能处理标准的带余除法,所以可以把这个式子转换成一个标准的带余除法,然后加以处理:

x+n = qn + (n+r'),其中 0<n+r'<=n            //最大非正剩余

x+n-1 = qn + (n+r'-1), 其中 0<= n+r'-1 <n    //最小非负剩余

所以 qn = [(x+n-1)/n]n.(当然也可表为x+n-1-(n+r'-1)) 用 c 语言计算就是:

((x+n-1)/n)*n

若 n 是 2 的方幂, 比如 2^m,则除为右移 m 位,乘为左移 m 位。所以把 x+n-1 的最低 m 个二进制位清 0就可以了。得到:

(x+n-1) & (~(n-1))

注意上面这个式子中对n-1操作时是对表示为二进制形式的n-1进行处理。

比如n=8,那么x+n-1整处8后再乘以8(相当于把余数抹掉)的操作就是先由8==1000(二进制)得到n-1==0111,然后取反为11111111 11111111 11111111 11111000,将x+n-1与之求位的与运算即可(即把x+n-1的二进制表示数的最后三位抹成零)。

如果n不是2的幂,则不能采用位运算的方法,可以采用普通的十进制方法。

size_t round_low(size_t x, size_t n) {
    return x - (x% n);
}
size_t round_up(size_t x,size_t n) {
    return (x + n - 1) - ((x + n - 1) % N);
}

利用ROUNDUP函数进行内存对齐相关推荐

  1. vector利用swap()函数进行内存的释放

    首先,vector与deque不同,其内存占用空间只会增长,不会减小.比如你首先分配了10,000个字节,然后erase掉后面9,999个,则虽然有效元素只有一个,但是内存占用仍为10,000个.所有 ...

  2. poi获取有效单元格个数_EXCEL利用SUM函数和FREQUENCY函数数组公式统计不同区间数据个数...

    EXCEL函数公式大全之利用FREQUENCY函数数组公式统计不同区间数据个数.EXCEL函数与公式在工作中使用非常的频繁,会不会使用公式直接决定了我们的工作效率,今天我们来学习一下提高我们工作效率的 ...

  3. 2万字 + 50 张图,细说 JVM 内存分布、内存对齐、压缩指针

    今天为大家带来一篇 2 万字的硬核技术文章. 本文我们将从计算机组成原理的角度详细阐述对象在JVM内存中是如何布局的,以及什么是内存对齐,如果我们头比较铁,就是不进行内存对齐会造成什么样的后果,最后引 ...

  4. 7. 重磅硬核 | 一文聊透对象在JVM中的内存布局,以及内存对齐和压缩指针的原理及应用

    重磅硬核 | 一文聊透对象在JVM中的内存布局,以及内存对齐和压缩指针的原理及应用 大家好,我是bin,又到了每周我们见面的时刻了,我的公众号在1月10号那天发布了第一篇文章?<从内核角度看IO ...

  5. 一文聊透对象在JVM中的内存布局,以及内存对齐和压缩指针的原理及应用

    大家好,我是bin,又到了每周我们见面的时刻了,我在1月10号那天发布了第一篇文章<从内核角度看IO模型的演变>,在这篇文章中我们通过图解的方式以一个C10k的问题为主线,从内核角度详细阐 ...

  6. C语言基础知识之define宏定义表达式,undef,内存对齐,a和a的区别,数组知识点,int (*)[10] p,二维数组参数与二维指针参数,函数指针数组,常见的内存错误及对策

    一.用define宏定义表达式 1.定义一年有多少秒: #define SEC_A_YEAR 60*60*24*365 //上述描述不可靠,没有考虑到在16位系统下把这样一个数赋给整型变量的时候可能会 ...

  7. Linux下的内存对齐函数

    在Linux下内存对齐的函数包括posix_memalign, aligned_alloc, memalign, valloc, pvalloc,其各个函数的声明如下: int posix_memal ...

  8. iOS之深入解析内存对齐的底层原理

    CPU 存取原理 一."存"示例 CPU 并不是以字节为单位存取数据的.CPU 把内存当成是一块一块的,块的大小可以是2,4,8,16字节大小,因此 CPU 在读取内存时是一块一块 ...

  9. Nginx学习笔记(五) 源码分析内存模块内存对齐

    Nginx源码分析&内存模块 今天总结了下C语言的内存分配问题,那么就看看Nginx的内存分配相关模型的具体实现.还有内存对齐的内容~~不懂的可以看看~~ src/os/unix/Ngx_al ...

  10. 自定义类型详解:结构体(内存对齐、位段) + 枚举 + 联合

    目录 一.结构体 1.特殊的声明 2.结构体自引用 3.结构体变量的定义和初始化 4.打印结构体 二.==结构体内存对齐== 1.内存对齐 结构体嵌套如何求 为什么存在内存对齐? 2.修改默认对齐数 ...

最新文章

  1. 网络编程--ftp客户端的实现(c#版)
  2. 微信小程序超级占内存_6款宝藏微信小程序,简单又实用,节约内存就靠它了...
  3. truffle (ETH以太坊智能合约集成开发工具) 入门教程
  4. Django Forms实例
  5. 【XAudio2】7.如何加载音频数据文件
  6. Spark(5)——standalone模式
  7. NumpyPandas的区别和联系
  8. html5 无障碍,[Vue 3] 教程 – 无障碍 – 基础
  9. laravel 安装
  10. junit 重复测试多个类_JUnit重复测试– @RepeatedTest
  11. 百度安全专家盘点:非官方购火车票渠道 几乎都不靠谱
  12. python画素描画_画画了,画画了,几行Python就成一幅素描画
  13. ios 原子属性atomic加锁性能与锁对比, 不推荐的原因
  14. JAVA GUI同一个窗体切换面板JPanel以及获取JFrame方法的注意事项
  15. Centos安装RabbitMQ超详细(必须收藏)
  16. 喜欢游戏学计算机,我喜欢电脑游戏小学作文
  17. 对于MSP430F5529时钟系统的理解
  18. 笔记本喇叭无声音解决方案
  19. 【JavaScript编写计算工资小程序】【表格细边框设置】【网页设计与网站开发HTML、CSS、JavaScript实例教程】【第十章】JavaScript基础——【传智播客】实验作业题【实验5】
  20. kubernetes: coredns故障 /etc/coredns/Corefile问题

热门文章

  1. android 图片/视频混合轮播控件banner
  2. htb:Starting Point
  3. 垃圾邮件服务器 查询,邮件服务器ip黑名单查询
  4. Error creating bean with name ‘serverEndpointExporter‘ defined in class path resource
  5. 刘未鹏的博中带的技术博客链接
  6. 汇编语言典型例子详解_汇编语言程序设计例子
  7. php 499状态如何处理,HTTP499状态码 nginx下499错误及其解决方法
  8. 实时PPP多系统组合与单系统解算ZTD和Clock差异
  9. hdu2028java-Lowest Common Multiple Plus
  10. Unity 动态编辑Terrain地形(五)贴图