2的m次方 内存对齐

时间:2022-02-21 22:15:12

在存储的时候,为了提高效率,一般都会让偏移量落在2的m次方的位置上,而且常有向上取整和向下取整两种需求。
向下取整
PALIGN_DOWN(x,align)  (x & (- align))
 
这样做为什么可以,因为align 取反 还是自己,只是高位全变成1了,然后再和原来的数&运算,此时不对齐多出来的1都被清0了。
PALIGN_UP(x,align) (-(-x) & (-align))
原理也比较容易推断,将x变成负数,那么对-x 向下取反,得到的数是向下取反的负数,但是再加一个负号,负负得正,获得了一个更大的整数
实现了向上取整。
相当于 PALIGN_UP(x,align) =====> -PALIGN_DOWN(-x,align)

PALIGN_DOWN向下取整例子:

4二进制:

0000 0100

1111 1100

如果x是3, 011,和-align相与后为0

如果x是5,101,相与后是4.

一篇文章:

内存对齐算法

字节对齐是在分配内存时需要考虑的问题,两个小算法:

(1)最容易想到的算法:

  1. unsigned int calc_align(unsigned int n,unsigned align)
  2. {
  3. if ( n / align * align == n)
  4. return n;
  5. return  (n / align + 1) * align;
  6. }

(2)更好的算法:

  1. unsigned int calc_align(unsigned int n,unsigned align)
  2. {
  3. return ((n + align - 1) & (~(align - 1)));
  4. }

对于2算法原理如下:

2字节对齐,要求地址位为2,4,6,8...,要求二进制位最后一位为0(2的1次方)
4字节对齐,要求地址位为4,8,12,16...,要求二进制位最后两位为0(2的2次方)
8字节对齐,要求地址位为8,16,24,32...,要求二进制位最后三位为0(2的3次方)
16字节对齐,要求地址位为16,32,48,64...,要求二进制位最后四位为0(2的4次方)
...
由此可见,我们只要对数据补齐对齐所需最少数据,然后将补齐位置0就可以实现对齐计算。
 
(1)(align-1),表示对齐所需的对齐位,如:2字节对齐为1,4字节为11,8字节为111,16字节为1111...
(2)(x+(align-1)),表示x补齐对齐所需数据      
(3)&~(align-1),表示去除由于补齐造成的多余数据
(4) (x+(align-1))&~(align-1),表示对齐后的数据
 
举个例子:如8字节对齐。起始地始是6
6 + (8 - 1)=0000 0110 + 0000 0111 = 0000 1101
0000 1101 & ~(0000 0111) = 0000 1000  //去除由于补齐造成的多余数据
 

2的m次方 内存对齐的更多相关文章

  1. struct内存对齐1:gcc与VC的差别

    struct内存对齐:gcc与VC的差别 内存对齐是编译器为了便于CPU快速访问而采用的一项技术,对于不同的编译器有不同的处理方法. Win32平台下的微软VC编译器在默认情况下采用如下的对齐规则:  ...

  2. c/c++中内存对齐完全理解

    一,什么是内存对齐?内存对齐用来做什么? 所谓内存对齐,是为了让内存存取更有效率而采用的一种编译阶段优化内存存取的手段. 比如对于int x;(这里假设sizeof(int)==4),因为cpu对内存 ...

  3. C++内存对齐总结

    大家都知道,C++空类的内存大小为1字节,为了保证其对象拥有彼此独立的内存地址.非空类的大小与类中非静态成员变量和虚函数表的多少有关. 而值得注意的是,类中非静态成员变量的大小与编译器内存对齐的设置有 ...

  4. C/C++: C++位域和内存对齐问题

    1. 位域: 1. 在C中,位域可以写成这样(注:位域的数据类型一律用无符号的,纪律性). struct bitmap { unsigned a : ; unsigned b : ; unsigned ...

  5. C/C++ 知识点1:内存对齐

    预备知识:基本类型占用字节 在32位操作系统和64位操作系统上,基本数据类型分别占多少字节呢? 32位操作系统: char : 1    int :4    short : 2    unsigned ...

  6. Windows+GCC下内存对齐的常见问题

    结构/类对齐的声明方式 gcc和windows对于modifier/attribute的支持其实是差不多的.比如在gcc的例子中,内存对齐要写成: class X { //... } __attrib ...

  7. c++内存对齐

    内存对齐原则: 1.数据成员对齐规则:struct, union的数据成员,第一个数据成员放在offset为0的地方,之后的数据成员的存储起始位置都是放在该数据成员大小的整数倍位置.如在32bit的机 ...

  8. C语言中内存对齐

    今天一考研同学问我一个问题,一个结构体有一个int类型成员和一个char类型成员,问我这个结构体类型占多少个字节,我直接编个程序给他看结果.这个结构体占八个字节,咦,当时我蛮纳闷的,一个int类型四个 ...

  9. 内存对齐 和 sizeof小结

    数据对齐(内存对齐)指该数据所在的地址必须是该数据长度的整数倍.X86CPU能直接访问对齐的数据,当它试图访问未对齐的数据时,会在内部进行一系列的调整,降低运行速度.数据对齐一般出现在结构体和类中,在 ...

随机推荐

  1. 配置Spark on YARN集群内存

    参考原文:http://blog.javachen.com/2015/06/09/memory-in-spark-on-yarn.html?utm_source=tuicool 运行文件有几个G大,默 ...

  2. linux忘记mysql密码找回方法

    linux忘记mysql教程密码找回方法 今天我们主要是讲一下关于linux忘记mysql密码处理方法,下面提供了5种linux忘记mysql密码找回方法哦.    方法一: # /etc/init. ...

  3. 【转】supervisor安装与配置

    1.安装 宿主机环境:(Centos7) 宿主机环境 #yum install python-setuptools yum install python-setuptools#easy_install ...

  4. linux 终端显示 -bash-4.1

    解决方法: cp /etc/skel/.bashrc /root/ cp /etc/skel/.bash_profile  /root/ 重新登陆就OK了

  5. MTP设备无法安装驱动的解决办法

    1,进入设备管理器右击带黄色问号的MTP,选择“属性”,“详细信息”“设备范例 ID”(用Ctrl+C复制). 2,找到c:\windows\inf\wpdmtp.inf打开(或者通过运行打开),找到 ...

  6. MySql 学习笔记 (派生表)

    派生表也是一种子查询那么它出现在 select * from ( select * from b <--这个就是派生表啦 )派生表其实不是个好东西,在生产的时候他是可以通过索引来过滤的,但是一但 ...

  7. 管中窥豹——从对象的生命周期梳理JVM内存结构、GC调优、类加载、AOP编程及性能监控

    如题,本文的宗旨既是透过对象的生命周期,来梳理JVM内存结构及GC相关知识,并辅以AOP及双亲委派机制原理,学习不仅仅是海绵式的吸收学习,还需要自己去分析why,加深对技术的理解和认知,祝大家早日走上 ...

  8. MYSQL数据库相关操作---读书笔记分享

    ===================数据库软件: <DBMS,DataBase Management System >数据库: 保存特定类型数据的容器<DB,database&gt ...

  9. LeetCode算法题-Rotated Digits(Java实现)

    这是悦乐书的第316次更新,第337篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第185题(顺位题号是788).如果一个数字经过180度旋转后,变成了一个与原数字不同的 ...

  10. iOS---------如何搭建ipv6环境

    第一步:首先打开共享 第二步:点击互联网共享,然后按option键.会出现创建NAT64网络 第三步:点击Wi-Fi共享,设置网络名称,频段:11.安全性:WPA2个人级.密码设置8位就可以了.然后在 ...