类大小

学习笔记
1,空类大小至少为1;
2,无虚函数时大小为非静态成员变量大小。多个成员变量编译器会进行优化对齐;
3,有虚函数时大小为非静态成员变量大小(遵从2条件)+虚表指针大小。
4,虚表指针大小与有多少个虚函数无关。
大佬博客详细描述:https://blog.csdn.net/longjialin93528/article/details/80160467?utm_medium=distribute.pc_relevant_t0.none-task-blog-OPENSEARCH-1.control&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-OPENSEARCH-1.control
#include
#include “string”

using namespace std;

int m_e1 = 0;

class A {
public:
A() {cout << “A”<<endl;};
~A() {cout << “~A”<<endl;};
void print() {cout << “Aprint”<<endl;};
};

class B {
public:
B() {cout << “B”<<endl;};
~B() {cout << “~B”<<endl;};
virtual void print() {cout << “Bprint”<<endl;};
};

class C {
public:
C() {cout << “C”<<endl;};
~C() {cout << “~C”<<endl;};
void print() {cout << “Cprint”<<endl;};
public:
int m_c{0};
};

class F {
public:
F() {cout << “F”<<endl;};
~F() {cout << “~F”<<endl;};
virtual void print() {cout << “Fprint”<<endl;};
public:
int m_f{0};
};

class D: public C, B{
public:
D() {cout << “D”<<endl;};
~D() {cout << “~D”<<endl;};
virtual void print() {cout << “Dprint”<<endl;};
public:
int m_d{0};
};

class E {
public:
E() {cout << “E”<<endl;};
~E() {cout << “~E”<<endl;};
void print() {cout << “Eprint”<<endl;};
public:
int m_e{0};
static int m_e1;
};

class G {
public:
G() {cout << “G”<<endl;};
~G() {cout << “~G”<<endl;};
virtual void print() {cout << “Gprint”<<endl;};
public:
char m_g{0};
};

class H {
public:
H() {cout << “H”<<endl;};
~H() {cout << “~H”<<endl;};
virtual void print() {cout << “Hprint”<<endl;};
virtual void print1() {cout << “Hprint1”<<endl;};
public:
char m_h{0};
};

int main() {
A* a = new A();
B* b = new B();
C* c = new C();
D* d = new D();
E* e = new E();
F* f = new F();
G* g = new G();
H* h = new H();
cout << &a << " " << sizeof(A) << endl; // 空类大小至少为1
cout << &b << " " << sizeof(B) << endl; // 虚表指针大小
cout << &c << " " << sizeof© << endl; // 成员变量大小
cout << &d << " " << sizeof(D) << endl; // 成员变量大小+虚表指针大小(编译器优化,成员变量补齐->2个int型对齐)
cout << &e << " " << sizeof(E) << endl; // 非静态成员变量大小(不包含静态成员变量)
cout << &f << " " << sizeof(F) << endl; // 成员变量对齐大小+虚表指针大小(编译器优化,成员变量补齐->int补齐到总线位宽)
cout << &g << " " << sizeof(G) << endl; // 成员变量对齐大小+虚表指针大小(编译器优化,成员变量补齐->char补齐到总线位宽)
cout << &h << " " << sizeof(H) << endl; // 成员变量对齐大小+虚表指针大小(编译器优化,成员变量补齐->char补齐到总线位宽)
delete a;
delete b;
delete c;
delete d;
delete f;
delete g;
delete h;
return 0;
}
输出
C:\Users\Admin\CLionProjects\untitled\cmake-build-debug\untitled.exe
A
B
C
C
B
D
E
F
G
H
0x61fd38 1
0x61fd30 8
0x61fd28 4
0x61fd20 16
0x61fd18 4
0x61fd10 16
0x61fd08 16
0x61fd00 16
~A
~B
~C
~D
~B
~C
~F
~G
~H

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值