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字节对齐