((sizeof(n)+sizeof(int)-1)&~(sizeof(int)-1))
来源于:https://blog.csdn.net/QQ1910084514/article/details/80375743
注:带颜色的部分文本是转发者添加的
2018年05月19日 17:28:45 4559 阅读数:103
版权声明:喜欢可以转载哦,声明一下哈 https://blog.csdn.net/QQ1910084514/article/details/80375743
((sizeof(n)+sizeof(int)-1)&~(sizeof(int)-1))的使用要追溯到
va_start(vp, n); 的使用,在我不断不断的转定义后出现了
#define _INTSIZEOF(n) ((sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1))
问题就是 _INTSIZEOF(n) 是干嘛的
答案是内存对齐
那么什么是内存对齐呢?为什么要内存对齐呢?
戳这! https://blog.csdn.net/QQ1910084514/article/details/80375800
回到正题我要解读的是((sizeof(n)+sizeof(int)-1)&~(sizeof(int)-1))为什么实现了内存对齐
1.举个栗子解释一下内存对齐是什么
比方说有一个箱子可以装4个瓶子(相当于内存中4个字节的对齐空间,刚好对齐),我有8个瓶子 ,那么我需要2个箱子如果我有10个瓶子呢,我不能说我需要10除4,需要2.5个箱子吧。实际上我需要3个箱子,那怎么求我实际需要的箱子数呢(相当于需要多少个对齐空间,此空间的大小是占内存4个字节)?
用一个容易理解的公式来求上述问题
设我的瓶子数为B,我需要的箱子数为C,一个箱子最多可以装A个瓶子
公式:C=(B+A-1)/A 反斜杠 /是取整的意思。 //C的含义是需要多少个箱子,对于本题来说相当于需要多少个4字节的对齐空间,
//此式子的通用意思是有B个数量的货物,求C:就是求需要多少个A能放得下B个货物,也可以这样理
//解:B代表字节数,A代表4个字节的空间,式子:(B+A-1)/A得到的是这么多少A个字节数,即最多需要多少个
//4字节的对齐空间,推而广之:B= sizeof(n) A= sizeof(int),带入公式(B+A-1)/A得:
//(sizeof(n)+sizeof(int)-1) / sizeof(int),这个式子的意思是得到多少个4的倍数,也就是说式子:(sizeof(n)+sizeof(int)-1)
//和/ sizeof(int)组合后会得到多少个4字节的对齐空间,上面的式子(sizeof(n)+sizeof(int)-1) / sizeof(int)不是C语言的的写法。
//任何一个数m/sizeof(int)都是4的倍数,c语言中有一个式子可以做到任何数与这个数相&都是4的倍数,那么这个数(式子)
//就是:式子:&~(sizeof(int)-1),于是把上面的数学式子式子(sizeof(n)+sizeof(int)-1) / sizeof(int)就可以变成c语言的语
// 句就是:(sizeof(n)+sizeof(int)-1)&~(sizeof(int)-1).这就是此式子的来历。
带入几个例子
B=10, A=4 得C=13/4 ,C=3 每个箱子最多能装4个瓶子,10个瓶子需要3个箱子
B=14,A=4 得C=17/4 ,C=4 每个箱子最多能装4个瓶子,14个瓶子需要4个箱子
显然这个公式正确
2.细致的分析一下((sizeof(n)+sizeof(int)-1)&~(sizeof(int)-1))
((sizeof(n)+sizeof(int)-1)&~(sizeof(int)-1)) ((sizeof(n)+sizeof(int)-1)其实就是 (B+A-1)
|
|
((sizeof(n)+sizeof(int)-1) (sizeof(n)是我们需要的实际内存大小,相对于我的瓶子数
|
|
((sizeof(n)+sizeof(int)-1) sizeof(int)是内存大小分配的最小刻度,相对于箱子最多可以装瓶子的个数
~为按位取反位运算符号
~(sizeof(int)-1))>~(4-1)>~3>00000000000000000000000000000011>11111111111111111111111111111100
任何数与 11111111111111111111111111111100进行&运算最低的两位都为0,得到的都是4的倍数
((sizeof(n)+sizeof(int)-1)&~(sizeof(int)-1)) &~(sizeof(int)-1))其实就是 除以A或者说除以4
((sizeof(n)+sizeof(int)-1)&~(sizeof(int)-1)) 其实就是实现栗子中的(B+A-1)/A
比较好的解释:
~是位取反的意思。
_INTSIZEOF(n)整个做的事情就是将n的长度化为int长度的整数倍。
比如n为5,二进制就是101b,int长度为4,二进制为100b,那么n化为int长度的整数倍就应该为8。
~(sizeof(int) – 1) )就应该为~(4 - 1) = ~(00000011b) = 11111100b,这样任何数& ~(sizeof(int) – 1) )后最后两位肯定为0,就肯定是4的整数倍了。
(sizeof(n) + sizeof(int) – 1)就是将大于4m但小于等于4(m + 1)的数提高到大于等于4(m + 1)但小于4(m + 2),这样再& ~(sizeof(int) – 1))后就正好将原长度补齐到4的倍数了。