C++基础复习提升-sizeof那些事
参考C++那些事-光城大佬的网站
上一篇C++基础复习提升-inline那些事
下一篇C++基础复习提升-纯虚函数和抽象类那些事
结构体对齐(字节对齐)规则及大小计算
1.1空类的大小为1字节
//inline.h
#ifndef TEST
class A {
public:
A() {};
};
#endif
//main.cpp
#include <iostream>
#include "inline.h"
using namespace std;
int main() {
// sizeof:1
cout << sizeof(A) << endl;
return 0;
}
1.2一个类中,虚函数本身、成员函数(包括静态与非静态)和静态成员变量都是不占用类对象的存储空间的
//inline.h
#ifndef TEST
//静态数据成员被编译器放在程序的一个global data members中,
//它是类的一个数据成员,但不影响类的大小。
//不管这个类产生了多少个实例,还是派生了多少新的类,静态数据成员只有一个实例。
//静态数据成员,一旦被声明,就已经存在。
class A {
public:
//虚函数vptr大小为8
virtual void func() {};
static int c;
static int a;
static int d;
};
#endif
//main.cpp
#include <iostream>
#include "inline.h"
using namespace std;
int main() {
//sizeof:8
cout << sizeof(A) << endl;
return 0;
}
1.3对于包含虚函数的类,不管有多少个虚函数,只有一个虚指针,vptr的大小
//inline.h
#ifndef TEST
//静态数据成员被编译器放在程序的一个global data members中,
//它是类的一个数据成员,但不影响类的大小。
//不管这个类产生了多少个实例,还是派生了多少新的类,静态数据成员只有一个实例。
//静态数据成员,一旦被声明,就已经存在。
class A {
public:
virtual void fun() {};
virtual void fun1() {};
virtual void fun2() {};
};
#endif
//main.cpp
#include <iostream>
#include "inline.h"
using namespace std;
int main() {
// sizeof:8
cout << sizeof(A) << endl;
return 0;
}
1.4普通继承,派生类继承了所有基类的函数与成员,要按照字节对齐来计算大小(比较时需注意和字节长度小的比较)
//inline.h
#ifndef TEST
#pragma pack(4)
class A {
public:
char a;
int b;
};
class B : A {
public:
short a;
long b;
};
#pragma pack()
#endif
//main.cpp
#include <iostream>
#include "inline.h"
using namespace std;
int main() {
// sizeof:8
cout << sizeof(A) << endl;
// B字节对齐(默认大小4) sizeof:16
// char a;
// int b;
// short a;
// long b;
cout << sizeof(B) << endl;
// sizeof:12
cout << sizeof(C) << endl;
// sizeof:4
cout << sizeof(long) << endl;
return 0;
}
1.5虚函数继承,不管是单继承还是多继承,都是继承了基类的vptr。(32位os4字节,64位os8字节)
//inline.h
#ifndef TEST
#pragma pack(4)
class A {
public:
char a;
int b;
};
class C {
// sizeof : 8
A a;
// 补位到12%4==0;
char c;
};
class A1 {
virtual void fun() {}
};
class C1 : public A {
};
#pragma pack()
#endif
//main.cpp
#include <iostream>
#include "inline.h"
using namespace std;
int main() {
// sizeof : 12
cout << sizeof(C) << endl;
// 对于虚单函数继承,派生类也继承了基类的vptr,sizeof为8
cout << sizeof(C1) << endl;
return 0;
}
1.6虚继承,继承基类的vptr
//inline.h
#ifndef TEST
#pragma pack(4)
class A {
virtual void func() {};
};
class B {
virtual void func3() {};
};
//派生类虚继承多个虚函数,会继承所有虚函数的vptr
class C : virtual public A, virtual public B {
virtual void func2() {};
};
#pragma pack()
#endif
//main.cpp
#include <iostream>
#include "inline.h"
using namespace std;
int main() {
// 多继承两个虚基类,sizeof:8+8 vptr:8
cout << sizeof(C) << endl;
return 0;
}