gpt4 book ai didi

c++ - 找出 vptr 字段

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:06:31 31 4
gpt4 key购买 nike

我有几个类(class),我试图了解 vptr 和 vtable 在这种情况下是如何工作的。

class RGB {
short value[3];
};

class AbstractImage{
protected:
int n_pixels;
public:
virtual void show() = 0;
virtual AbstractImage* getMe() = 0;
virtual ∼AbstractImage() {};
};

template <typename T> class Image: public AbstractImage {
T* data;

public:
Image<T>(int n) { n_pixles=n; data=new T[n_pixles];}
virtual ∼Image<T>() { delete[] data; }
Image<T>(const Image<T>& rhs) {
n_pixels = rhs.n_pixels;
data = new T[n_pixels];
copyData(rhs);
}
Image<T>& operator=(const Image<T>& rhs) {
n_pixels = rhs.n_pixels;
delete[] data;
data = new T[n_pixels];
copyData(rhs);
return *this;
}

virtual void show() {/*some code*/}
virtual Image<T>* getMe() {return this;}

private:
void copyData(const Image<T>& rhs) {
for(int i=0l i<n_pixels;i++) {
data[i] = rhs.data[i];
}
}
};

typedef class Image<RGB> ColorImage;
typedef class Image<short> BWImage;

在运行以下实现后,我试图弄清楚堆栈和堆应该如何:

int main() {
AbstractImage* A = new ColorImage(4);
ColorImage B = colorImage(4);
A->show();
}

根据我的理解,创建了 2 个 vptr:

  1. B::vpointer - 在堆栈上
  2. A::vpointer - 在堆上

它们是否具有相同的值? (包含相同的地址?)这里有多少个虚表?

最佳答案

首先,重要的是要知道 C++ 标准不了解栈、堆和 vptr。所以这里能说的一切都取决于实现。

我们可以从标准中推断出什么?

您的代码创建了 2 ColorImage对象:

  • 自由存储中的一个对象,具有动态存储持续时间(在您的术语中称为“堆”),并且哪个指针存储在 A
  • 自动持续时间的本地对象(在您的术语中也称为“堆栈”)
  • 这是两个不同的对象

实现相关信息

两个对象具有相同的具体类型,即使两者之一是通过指向其基类的指针访问的。

这两个对象可能在它们的内存位置某处有一个 vptr指向与其具体(真实)类型对应的虚拟表。大多数编译器使用一个 vptr每个具体类类型。因此 vptr可能会指向同一个虚拟表。

我希望 AbstractImage 有一个虚拟表(它至少有一个虚函数成员),每个实例化的虚表Image<X> (即 Image<RGB>Image<short> 一个。ColorImageBWImage 只是同义词。但是如上所述,这只是假设,因为只要遵守标准,就允许编译器以不同的方式实现它。

附加信息:

关于c++ - 找出 vptr 字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49219090/

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