About sizeof
sizeof 的误解,sizeof 不是函数(function),是运算符(operator)
函数在程序运行的时候起作用,运算符求出来的大小是在编译时就确定下来的
常见的sizeof操作
- 对结构体类型求大小
1 | typedef struct { |
- 对联合体求大小
1 |
|
- 对字符串常量求大小
1 | char *p1 = "abc"; |
- 对指针变量、指针类型求大小
1 | char* ptr = "abcdefg"; |
- 对含有虚函数的class求大小
- 求数组的大小 、对变量求大小、 对类型求大小
1 | int array[] = {10, 20, 30, 100, 200}; |
- sizeof 的一个考题
1 |
|
sizeof 的原理
x按n字节对齐的宏的来源
x = nq + r, 其中 0 <= r < n //最小非负剩余
q, r 是唯一确定的。q = [x/n], r = x - n[x/n]. 这个是带余除法的一个简单形式。在 c 语言中, q, r 容易计算出来: q = x/n, r = x % n.
所谓把 x 按 n 对齐指的是:若 r=0, 取 qn, 若 r>0, 取 (q+1)n. 这也相当于把 x 表示为:
x = nq + r’, 其中 -n < r’ <=0 //最大非正剩余
nq 是我们所求。关键是如何用 c 语言计算它。由于我们能处理标准的带余除法,所以可以把这个式子转换成一个标准的带余除法,
然后加以处理:
x+n = qn + (n+r’),其中 0<n+r’<=n //最大正剩余
x+n-1 = qn + (n+r’-1), 其中 0<= n+r’-1 <n //最小非负剩余
所以 qn = [(x+n-1)/n]n. 用 c 语言计算就是:
((x+n-1)/n)*n
若 n 是 2 的方幂, 比如 2^m,则除为右移 m 位,乘为左移 m 位。所以把 x+n-1 的最低 m 个二进制位清 0就可以了。得到:
(x+n-1) & ~(n-1)
All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.