((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个瓶子,我有8个瓶子 ,那么我需要2个箱子如果我有10个瓶子呢,我不能说我需要10除4,需要2.5个箱子吧。实际上我需要3个箱子,那怎么求我实际需要的箱子数呢?
用一个容易理解的公式来求上述问题
设我的瓶子数为B,我需要的箱子数为C,一个箱子最多可以装A个瓶子
公式:C=(B+A-1)/A
带入几个例子
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的倍数了。