牛骨文教育服务平台(让学习变的简单)
博文笔记

_INTSIZEOF(n)

创建时间:2014-09-24 投稿人: 浏览次数:233

最近调试程序,在可变长参数中遇到了这个宏  _INTSIZEOF(n),于是上网一查,原来是把 sizeof(n) “向上取整”成 sizeof(int) 的整数倍,用来地址对齐。

sizeof(int)多大呢?在VC 2010中,sizeof(int) = 4. 如有疑问,见下面链接,

http://msdn.microsoft.com/en-us/library/s3f49ktz(v=vs.100).aspx

http://msdn.microsoft.com/en-us/library/cc953fe1(v=vs.100).aspx

http://msdn.microsoft.com/en-us/library/296az74e(v=vs.100).aspx

别的编译环境下多大呢?C++标准对此有没有什么约束?不太清楚。


#define _INTSIZEOF(n)   ( (sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) ) 这个式子怎么做到 “向上取整”成 sizeof(int)的整数倍的?执果索因

x、N都是正整数,要把x “向上取整”成N的整数倍:把x 写成 kN+r 的形式,其中,0 <= r <= N-1


在数学上,首先想到的是一个分段函数:

当r=0,f(x) = f(kN+r) = f(kN) = kN = x; 否则,f(x) = f(kN+r) = kN + N = x+N = (k+1)N.

如何这个分段函数的 表达式写成一个呢?即如何

当 r=0 时,由 x = kN+r 得到 k;当 1<= r <= N-1时,由 x = kN+r 得到 k+1 ?

 直接用x/N 总是得到k,如何得到 k+1 ? 考虑增大分子,(x+ 一个数)/ N = (kN+r + 一个数)/ N , 这个数是多少,能让 r=0 时结果为k,否则结果为k+1?

也就等价于 这个数是要小于N,同时也要足够大,大到能让最小的正余数 r=1时,也能让 r 加上它之后不再小于N。

1+x >=N, x<N, 则x = N-1。

即 f(x)=floor( (x+N-1) /N ) *N;

若 N是2^m , 则 ((x+N-1) >>m) <<m

相当于把 (x+N-1) 低m位 置零,

所以就有上面的式子了。

声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。