一文读懂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字节对齐