一文读懂sizeof的用法
- 2019 年 10 月 8 日
- 筆記
sizeof
首先是一个操作符,是内置的,不是函数。主要用来求所占用对象锁占用的字节数。具体使用方式:
sizeof express 或者 sizeof(type) .
以32位为例:
sizeof 基本类型
cout<< sizeof(int) << endl; // 输出 4 cout<< sizeof(char) << endl; //输出 1 cout<< sizeof(short) << endl; //输出 2
sizeof 数组与指针
char chArr[10] = "123"; cout<< sizeof(chArr) << endl; //输出 10 字节 整个数组长度是10个字节 cout<< sizeof(chArr[0]) << endl; // 输出1 ,char型 1 const char* chPoint = "123"; cout<< sizeof(chPoint) << endl;//输出4 指针的字节数 4 int * p; cout<< sizeof(p) << endl;//输出4 指针的字节数 4
sizeof struct
关键要注意区分字节对齐,
对齐的两个原则:
1.占用空间最大成员变量的字节数作为对齐方式
2.内存按照成员的先后顺序来排列。不够对齐的,补齐字节即进行padding。
//以结构体内最大的字节类型对齐 注意区分下面两种情况: struct St1 { char a;// 1 + padding 3 int b; // 4 + padding 0 short c; // 2 + padding 2 }; // total: 4+4+4 = 12 struct St2 { int a; // 4 + padding 0 char b; // 1 + padding 0 short c; // 2 + padding 1 }; //total:4+1+2 = 8.
sizeof union
union UN{ int a; char b; }; cout<<"UN:" << sizeof(UN) << endl;//输出4 按照最长的对齐
sizeof class
sizeof对class的时候,用来表示class中所有字段类型占用的字节数,对于空类,默认结果是1.
虚继承和虚函数都分别占有一个指针。子类的字节数包含父类。
//空类 class A{} ;//sizeof(A):1 //继承 class A1{public : int a ;} ///sizeof A1: 4 class A2 :public A1 {} //sizof A2:4 继承了A1 的int型字节数 //带有static对象的类型 class A3{static int a;} ;//sizeof(A3):1 static存储在静态存储区,不计算在class对象的字节数内 //虚函数 class B { public: virtual void f(){}; }; //sizeof B : 4 .虚函数里保存一个指向虚表的指针,所以是4. //虚继承 class D : public virtual B //虚函数 虚继承 两个指针 占有两个int 字节 8 { };//sizof D : 8字节 class E: public virtual B //虚函数 虚继承 两个指针 占有两个int 字节 8 { //virtual void f(){}; };//sizof F : 8字节 class F :public D ,E { //void f(){}; }; //sizof F : 16字节 继承自 D 和E的字节数
pack语句
使用prama pack 可以设定字节的对齐长度。如:
#pragma pack(4)//设定为4字节对齐