码迷,mamicode.com
首页 > 其他好文 > 详细

#pragma pack(n) 的宏实现

时间:2015-01-20 22:17:19      阅读:113      评论:0      收藏:0      [点我收藏+]

标签:aligned   #pragma pack   对齐   

老样子,上代码,上公式

#ifndef ALIGNED
#define ALIGNED(T, A, B) (((A) + (B) - 1) & (~((T)(B) - 1)))
#endif

在VC 平台上 我们会这样让内存对其

#pragma pack(n) /* n = 1, 2, 4, 8, 16 */

如果我们写这样一个程序,该如何实现呢?


这里先上一个例子:例如 7, 以4 对齐, 我们知道对齐后的大小是比7大的4的最小的整数倍。

4的二进制是0100, 减一取反 ~(0100-0001)是1100

数字7的二进制是0111

 0111 & 1100 = 0100  化成十进制是4,正好是4的倍数。


通过这种方式,对于一个数A,以B对齐,可以找到比A小的B的最大的整数倍。 ①


但我们需要求得是A大的B的最小的整数倍。

我们只要将A = (A+B-1)即可 ②


结合①②

我们得出公式

#ifndef ALIGNED
#define ALIGNED(A, B) (((A) + (B) - 1) & (~((B) - 1)))
#endif
这个公式和我么一开始上的公式有区别T,T是类型,可以是LONG,LONGLONG等,目的是二进制转化后没有符号。



#pragma pack(n) 的宏实现

标签:aligned   #pragma pack   对齐   

原文地址:http://blog.csdn.net/sqqsongqiqi/article/details/42920699

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!