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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值