一文读懂sizeof的用法

2019-09-29 12:32:14 浏览数 (2)

sizeof

首先是一个操作符,是内置的,不是函数。主要用来求所占用对象锁占用的字节数。具体使用方式:

sizeof express 或者 sizeof(type) .

以32位为例:

sizeof 基本类型

代码语言:txt复制
cout<<  sizeof(int) << endl; // 输出 4
cout<<  sizeof(char) << endl; //输出  1
cout<<  sizeof(short) << endl; //输出  2

sizeof 数组与指针

代码语言:txt复制
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。

代码语言:txt复制
//以结构体内最大的字节类型对齐 注意区分下面两种情况:
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

代码语言:txt复制
union UN{
    int a;
    char b;
};

cout<<"UN:" <<  sizeof(UN) << endl;//输出4 按照最长的对齐

sizeof class

sizeof对class的时候,用来表示class中所有字段类型占用的字节数,对于空类,默认结果是1.

虚继承和虚函数都分别占有一个指针。子类的字节数包含父类。

代码语言:txt复制
//空类
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 可以设定字节的对齐长度。如:

代码语言:txt复制
#pragma   pack(4)//设定为4字节对齐  

0 人点赞