gpt4 book ai didi

c++ - 继承类的内存布局

转载 作者:IT老高 更新时间:2023-10-28 21:42:18 25 4
gpt4 key购买 nike

我很想知道这些类(class)在内存中的具体安排方式,尤其是。具有继承和虚函数。

我知道这不是由 c++ 语言标准定义的。但是,是否有任何简单的方法可以通过编写一些测试代码来找出您的特定编译器将如何实现这些?

编辑:- 使用下面的一些答案:-

#include <iostream>

using namespace std;

class A {
public:
int a;
virtual void func() {}
};

class B : public A {
public:
int b;
virtual void func() {}
};

class C {
public:
int c;
virtual void func() {}
};

class D : public A, public C {
public:
int d;
virtual void func() {}
};

class E : public C, public A {
public:
int e;
virtual void func() {}
};

class F : public A {
public:
int f;
virtual void func() {}
};

class G : public B, public F {
public:
int g;
virtual void func() {}
};

int main() {
A a; B b; C c; D d; E e; F f; G g;
cout<<"A: "<<(size_t)&a.a-(size_t)&a<<"\n";
cout<<"B: "<<(size_t)&b.a-(size_t)&b<<" "<<(size_t)&b.b-(size_t)&b<<"\n";
cout<<"C: "<<(size_t)&c.c-(size_t)&c<<"\n";
cout<<"D: "<<(size_t)&d.a-(size_t)&d<<" "<<(size_t)&d.c-(size_t)&d<<" "<<(size_t)&d.d- (size_t)&d<<"\n";
cout<<"E: "<<(size_t)&e.a-(size_t)&e<<" "<<(size_t)&e.c-(size_t)&e<<" "<<(size_t)&e.e- (size_t)&e<<"\n";
cout<<"F: "<<(size_t)&f.a-(size_t)&f<<" "<<(size_t)&f.f-(size_t)&f<<"\n";
cout<<"G: "<<(size_t)&g.B::a-(size_t)&g<<" "<<(size_t)&g.F::a-(size_t)&g<<" " <<(size_t)&g.b-(size_t)&g<<" "<<(size_t)&g.f-(size_t)&g<<" "<<(size_t)&g.g-(size_t)&g<<"\n";
}

输出是:-

A: 8
B: 8 12
C: 8
D: 8 24 28
E: 24 8 28
F: 8 12
G: 8 24 12 28 32

所以所有类在 loc 0 处都有一个大小为 8 的 v-ptr。D 在位置 16 有另一个 v-ptr。对于 E 也是如此。G 似乎在 16 处也有一个 v-ptr,尽管根据我(有限的)理解,我猜它有更多。

最佳答案

一种方法是打印出所有成员的偏移量:

class Parent{
public:
int a;
int b;

virtual void foo(){
cout << "parent" << endl;
}
};

class Child : public Parent{
public:
int c;
int d;

virtual void foo(){
cout << "child" << endl;
}
};

int main(){

Parent p;
Child c;

p.foo();
c.foo();

cout << "Parent Offset a = " << (size_t)&p.a - (size_t)&p << endl;
cout << "Parent Offset b = " << (size_t)&p.b - (size_t)&p << endl;

cout << "Child Offset a = " << (size_t)&c.a - (size_t)&c << endl;
cout << "Child Offset b = " << (size_t)&c.b - (size_t)&c << endl;
cout << "Child Offset c = " << (size_t)&c.c - (size_t)&c << endl;
cout << "Child Offset d = " << (size_t)&c.d - (size_t)&c << endl;

system("pause");
}

输出:

parent
child
Parent Offset a = 8
Parent Offset b = 12
Child Offset a = 8
Child Offset b = 12
Child Offset c = 16
Child Offset d = 20

所以你可以在这里看到所有的偏移量。您会注意到偏移 0 处没有任何内容,因为这可能是指向 vtable 的指针的位置。去。

还要注意继承的成员在 Child 和 Parent 中具有相同的偏移量。

关于c++ - 继承类的内存布局,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8672218/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com