【发布时间】:2015-03-22 13:01:14
【问题描述】:
假设我有一个分配一些缓冲区的池。
int size = 10;
T* buffer = (T*) new char[size * sizeof(T)];
如果我现在想将一些数据分配给缓冲区,我执行以下操作。
buffer[0] = data;
我现在的问题是初始化具有 vtable 的对象和不具有 vtable 的对象有什么区别。
据我所知,我可以毫无问题地将类分配给这个缓冲区,只要我不调用任何虚函数,函数调用就可以正常工作。 例如
class A{
void function(){}
};
A a;
buffer[0] = a;
a.function(); // works
但是:
class B{
void function(){}
virtual void virtual_function(){}
};
B b;
buffer[0] = b;
b.function(); // does work
b.virtual_function() // does not work.
为什么非虚函数会起作用?
是不是因为函数是一个普通的类函数而被静态声明的,因此在我们进行赋值时被复制了?
但是,如果我需要确保虚函数也能正常工作,我需要在我创建的缓冲区上调用构造函数是没有意义的。 new (buffer[0]) T(); 以便在创建的对象上调用构造函数。
两个示例首先创建适当大小的缓冲区,然后进行分配,将其视为一个池,我根据我想要放入池中的对象数量预先分配内存。
也许我只是看了很长时间,让自己感到困惑:)
【问题讨论】:
-
在第二个例子中,
B,buffer仍然用T=A声明吗? -
查看两个独立运行。缓冲区初始化如下: T* buffer = (T*) new char[size * sizeof(T)];其中 T 是 A 或 B。
-
第二次运行时我问的不是这个——缓冲区是如何声明的。
-
第一个问题很好!
-
如果buffer是多个不同类型的对象组成的数组,则需要为T ** buffer = new T* [size],并且每个都初始化为nullptr,其中T是一个基类所有可以进入那里的类型(A和B)。像 std::vector
> 这样的东西可能会更好。
标签: c++ constructor virtual variable-assignment vtable