((sizeof(n)+sizeof(int)-1)&~(sizeof(int)-1))

((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的倍数了。


猜你喜欢

转载自blog.csdn.net/QQ1910084514/article/details/80375743