1.1、 无继承, 无虚函数
class A {
private:
short pri_short_a;
public:
int i_a;
double d_a;
static char ch_a;
void funcA1() {
pri_short_a = 1;
i_a = 2;
d_a = 3.1;
}
};
char A::ch_a;
int main() {
A a;
a.funcA1();
cout << sizeof a << endl;
char *ptr = (char *) &a;
cout << *(short *) ptr << endl;
cout << *(int *) (ptr + 4) << endl;
cout << *(double *) (ptr + 8) << endl;
}
输出
内存布局
说明
1、静态数据成员属于类, 不占用具体对象内存
2、成员函数在代码区,不占用具体对象内存
3、数据成员的访问级别不影响其在内存中的排列和大小,均是按照声明的顺序在内存中有序布局,并适当对齐
1.2、 无继承, 有虚函数
class A {
private:
short pri_short_a;
public:
int i_a;
double d_a;
static char ch_a;
void funcA1() {
pri_short_a = 1;
i_a = 2;
d_a = 3.1;
}
virtual void funcA2() {
cout << "virtual void funcA2" << endl;
}
virtual void funcA3() {
cout << "virtual void funcA3" << endl;
}
};
char A::ch_a;
using F = void (*)();
int main() {
A a;
a.funcA1();
cout << sizeof a << endl;
char *ptr = (char *) &a;
// 虚表验证
cout << "虚表验证: " << endl;
// 取虚表头指针
auto *vptr = (long long *) (*(long long *) ptr);
F f;
f = (F) *vptr;
cout << "虚表第1个函数: ";
f();
f = (F) *(vptr + 1);
cout << "虚表第2个函数: ";
f();
// 数据验证
// 取数据首地址
auto *dptr = ptr + 8;
cout << "数据区验证: " << endl;
cout << *(short *) (dptr) << endl;
cout << *(int *) (dptr + 4) << endl;
cout << *(double *) (dptr + 8) << endl;
}
输出结果
内存布局
2.1 单一继承+虚函数布局
class A {
private:
short pri_short_a;
public:
int i_a;
double d_a;
static char ch_a;
void init() {
pri_short_a = 1;
i_a = 2;
d_a = 3.1;
}
virtual void funcA2() {
cout << "virtual void A::funcA2" << endl;
}
virtual void funcA3() {
cout << "virtual void A::funcA3" << endl;
}
};
char A::ch_a;
class B : public A {
public:
void funcA2() override {
cout << "virtual void B::funcA2" << endl;
}
};
using F = void (*)();
void memory_layout(char* ptr) {
// 虚表验证
cout << "虚表验证: " << endl;
// 取虚表头指针
auto *vptr = (long long *) (*(long long *) ptr);
F f;
f = (F) *vptr;
cout << "虚表第1个函数: ";
f();
f = (F) *(vptr + 1);
cout << "虚表第2个函数: ";
f();
// 数据验证
// 取数据首地址
auto *dptr = ptr + 8;
cout << "数据区验证: " << endl;
cout << *(short *) (dptr) << endl;
cout << *(int *) (dptr + 4) << endl;
cout << *(double *) (dptr + 8) << endl;
cout << "*****************************\n" << endl;
}
int main() {
A a;
a.init();
cout << sizeof a << endl;
char *ptr = (char *) &a;
memory_layout(ptr);
B b;
b.init();
cout << sizeof b << endl;
A* x = &b;
ptr = (char *) x;
memory_layout(ptr);
}
运行结果