#include<iostream> classA {}; intmain(void){ A a; printf("size of a:%lu", sizeof(a)); return0; }
其结果是size of a: 1,也就是空类占用一个字节。
仅有成员变量
1 2 3 4 5 6 7 8 9 10 11 12 13
#include<iostream> classA { public: int pub_i1; int pub_i2; }; intmain(void){ A a; printf("size of a:%lu\n", sizeof(a)); printf("address of pub_i1:%p\n", &a.pub_i1); printf("address of pub_i2:%p\n", &a.pub_i2); return0; }
结果如下:
1 2 3
size of a:8 address of pub_i1:0x7fffe2502740 address of pub_i2:0x7fffe2502744
从结果可以知道,公共成员变量占用空间和结构体是一样的,其内存布局如下:
非虚成员函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
#include<iostream> classA { public: int pub_i1; int pub_i2; voidpub_func1(){} voidpub_func2(){} }; intmain(void){ A a; printf("size of a:%lu\n", sizeof(a)); printf("address of pub_i1:%p\n", &a.pub_i1); printf("address of pub_i2:%p\n", &a.pub_i2); printf("address of func1:%p\n", (void*)(&A::pub_func1)); printf("address of func2:%p\n", (void*)(&A::pub_func2)); return0; }
结果如下:
1 2 3 4 5
size of a:8 address of pub_i1:0x7ffe58501900 address of pub_i2:0x7ffe58501904 address of func1:0x563f174fa904 address of func2:0x563f174fa91
#include<iostream> classA { public: int pub_i1; int pub_i2;
int *GetI3Addr(){ return &pri_i3; } int *GetI4Addr(){ return &pri_i4; } private: int pri_i3; int pri_i4; }; intmain(void){ A a; printf("size of a:%lu\n", sizeof(a)); printf("address of pub_i1:%p\n", &a.pub_i1); printf("address of pub_i2:%p\n", &a.pub_i2); printf("address of pri_i3:%p\n", a.GetI3Addr()); printf("address of pri_i4:%p\n", a.GetI4Addr()); return0; }
结果如下:
1 2 3 4 5
size of a:16 address of pub_i1:0x7fff65848b00 address of pub_i2:0x7fff65848b04 address of pri_i3:0x7fff65848b08 address of pri_i4:0x7fff65848b0c
可以看到私有成员变量和公共成员变量在存储上没有区别,其内存布局如下:
虚函数
在上面代码的基础上,增加virtual void pub_vfunc1(){}这一个虚函数。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
#include<iostream> classA { public: int pub_i1; int pub_i2; voidpub_func1(){} voidpub_func2(){} virtualvoidpub_vfunc1(){} }; intmain(void){ A a; printf("size of a:%lu\n", sizeof(a)); printf("address of pub_i1:%p\n", &a.pub_i1); printf("address of pub_i2:%p\n", &a.pub_i2); printf("address of func1:%p\n", (void*)(&A::pub_func1)); printf("address of func2:%p\n", (void*)(&A::pub_func2)); return0; }
结果为:
1 2 3 4 5
size of a:16 address of pub_i1:0x7fff7adf7678 address of pub_i2:0x7fff7adf767c address of func1:0x55c7089739c4 address of func2:0x55c7089739d0
从结果可以看出,虚函数占用了8个字节,那么我们再增加一个虚函数是否也会增加类的大小呢?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
#include<iostream> classA { public: int pub_i1; int pub_i2; voidpub_func1(){} voidpub_func2(){} virtualvoidpub_vfunc1(){} virtualvoidpub_vfunc2(){} }; intmain(void){ A a; printf("size of a:%lu\n", sizeof(a)); printf("address of pub_i1:%p\n", &a.pub_i1); printf("address of pub_i2:%p\n", &a.pub_i2); printf("address of func1:%p\n", (void*)(&A::pub_func1)); printf("address of func2:%p\n", (void*)(&A::pub_func2)); return0; }
结果为:
1 2 3 4 5
size of a:16 address of pub_i1:0x7ffe2a89ff18 address of pub_i2:0x7ffe2a89ff1c address of func1:0x55c205a279e4 address of func2:0x55c205a279f0
#include<iostream> classA { public: int pub_i1; int pub_i2; voidpub_func1(){} voidpub_func2(){} virtualvoidpub_vfunc1(){} virtualvoidpub_vfunc2(){} }; intmain(void){ A a; printf("size of a:%lu\n", sizeof(a)); printf("address of a:%p\n", &a); printf("address of pub_i1:%p\n", &a.pub_i1); printf("address of pub_i2:%p\n", &a.pub_i2); printf("address of pub_vfunc1:%p\n", (void*)(&A::pub_vfunc1)); printf("address of pub_vfunc2:%p\n", (void*)(&A::pub_vfunc2));
size of a:16 address of a:0x7ffd49855ab0 address of pub_i1:0x7ffd49855ab8 address of pub_i2:0x7ffd49855abc address of pub_vfunc1:0x55abbe9d3a4a address of pub_vfunc2:0x55abbe9d3a56 content of table[0]:55abbe9d3a4a content of table[1]:55abbe9d3a56