_INTSIZEOF(n)
最近调试程序,在可变长参数中遇到了这个宏 _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位 置零,
所以就有上面的式子了。
- 上一篇: sizeof,终极无惑(上)
- 下一篇: C++获取文件字节数