【发布时间】:2010-12-10 05:21:27
【问题描述】:
考虑:
class A
{
public:
virtual void update() = 0;
}
class B : public A
{
public:
void update() { /* stuff goes in here... */ }
private:
double a, b, c;
}
class C {
// Same kind of thing as B, but with different update function/data members
}
我现在在做:
A * array = new A[1000];
array[0] = new B();
array[1] = new C();
//etc., etc.
如果我调用sizeof(B),返回的大小是 3 个 double 成员所需的大小,加上虚函数指针表所需的一些开销。现在,回到我的代码,原来 'sizeof(myclass)' 是 32;也就是说,我的数据成员使用 24 个字节,虚函数表(4 个虚函数)使用 8 个字节。我的问题是:有什么办法可以简化这个吗?我的程序最终会使用大量内存,我不喜欢 25% 的内存被虚函数指针吃掉的声音。
【问题讨论】:
-
不要忘记虚拟析构函数。
-
查看您的分配策略,您最好调查使用来自每个
B、C等的自定义分配器。对大量单个对象使用基本new可能增加的开销比您意识到的要多。 -
如答案所述,您只需为每个实例支付一个指针(x86 上为 4 个字节,x64 上为 8 个字节)。但是,内存对齐可以稍微改变一下情况(例如,如果您有一个具有一个 char 和虚拟方法的类,它通常在 x86 上占用 8 个字节)。此外,Microsoft C++ 编译器在对齐 vfptr 时存在已知错误,该错误可以为类大小增加 4 个左右的字节。
-
您还应该考虑到,因为一个通用的 new 可能会处理多种类型的对象,它可能会分配更多 sizeof 需要的...