sizeof精要
来源:互联网 发布:手机淘宝举报在哪里看 编辑:程序博客网 时间:2024/05/17 01:03
要理解 sizeof 的要点,首先要明白字节对齐。
一. 字节对齐
但一般而言,满足以下两点个:
1) 结构体每个成员相对于结构体首地址的偏移量都是本成员大小的整数倍,如不满足则加上填充字节;
2) 结构体的总大小为结构体最宽的基本类型成员大小的整数倍,如不满足则在最后加上填充字;
- struct A {
- int a;
- char b;
- short c;
- };
- struct B {
- char b;
- int a;
- short c;
- };
- int main()
- {
- A aa = {0xffffffff, 0x11, 0xffff};
- B bb = {0x11, 0xffffffff, 0xffff};
- int xx = sizeof(aa);
- int yy = sizeof(bb);
- return 0;
- }
分析A:
首先第一个 int 为 4 。----
其次 char 为 1,char 成员相对于首地址的偏移量为4, 4是char 本身大小 1 的整数倍,所以可以接着安置。-----
然后 short 为2,short 成员相对于首地址的偏移量为5,5不是short 本身大小 2 的整数倍,所以在填充到6。-----X--
最后计算总大小,int 4+char 1+填充 1+ short 2 = 8,8是最宽int 4 的整数倍。所以后面不再填充。
调试结果如下:
分析B:
首先第一个 char为 1 。-
其次 int 为 4,int 成员相对于首地址的偏移量为 1, 1显然不是 int 本身大小 4 的整数倍,所以要填充到4。-XXX
然后 short 为2,short 成员相对于首地址的偏移量为 8,8 是short 本身大小 2 的整数倍,所以不需要填充。-XXX------
最后计算总大小,char 1 + 填充 3 + int 4 + short 2 = 10,10不是最宽 int 4 的整数倍。所以后面还要再填充到12。-XXX-----XX
调试结果如下:
二. sizeof 相关
1. sizeof 计算字符串长度
- char str1[20] = "0123456789";
- char str2[] = "0123456789";
- int a = sizeof(str1); //20
- int b = sizeof(str2); //11, 注意要还要加上 '\0'
- int c = strlen(str1); //10, 注意 strlen 参数只能是char*, 且必须以'\0'结尾
2. sizeof 计算含有虚函数的类对象大小
- class A
- {
- public:
- A(int x):a(x) {}
- virtual void print()
- {
- cout << "A" << endl;
- }
- private:
- int a;
- };
- class B:public A
- {
- public:
- B(int x):A(x-1),b(x)
- {}
- virtual void print()
- {
- cout << "B" << endl;
- }
- private:
- int b;
- };
- sizeof(A) == 8; // int 4 + 虚表指针 4 = 8
- sizeof(B) == 12; // int 4 + int 4 + 虚表指针 4 = 12
3. sizeof 计算含静态成员的类大小
- class A
- {
- public:
- int a;
- static int b;
- };
- int A:b = 10;
- sizeof(A) == 4; //只计算 int a
4. sizeof 计算联合体大小
- uniton u1
- {
- double a;
- int b;
- };
- uniton u2
- {
- char a[13];
- int b;
- };
- sizeof(u1) == 8; //联合体大小取所有成员中最大的一个成员的大小
- sizeof(u2) == 16; //最大成员为13,但要按 int 的对齐方式(也就是要能整除 int)
5. sizeof 其它方面
基本数据类型,char 1, shour 2, int 4, double 8, 指针 4
函数参数,看成指针 4
- sizeof 精要
- sizeof 精要
- sizeof 精要
- sizeof 精要
- sizeof精要
- 程序员面试精要-C/C++程序设计-预处理/const/sizeof(面试宝典读书笔记)
- SIZEOF
- Sizeof
- sizeof
- sizeof
- sizeof
- sizeof
- sizeof
- sizeof............
- sizeof
- sizeof
- sizeof
- sizeof
- js、jquery图片的局部放大
- RecyclerView(3) 事件处理和布局
- Caused by: org.xml.sax.SAXParseException; lineNumber: 28; columnNumber: 81;
- Visual Studio 2010打开工程非常慢一直卡在prepare solution窗口
- OpenCL之矩阵乘法实现
- sizeof精要
- servlet快速复习
- 第二届山东省ACM省赛回顾 Crack Mathmen(打表)
- 编程之美初赛第二场 扑克牌(四维dp,难)
- light oj 1248 - Dice (III)(期望)
- 多态
- Hopcroft-Karp 二分图HDU2389 Rain on your Parade
- lua gc和weaktable
- DP·数位DP(3)