【发布时间】:2011-09-26 02:35:42
【问题描述】:
假设我们有以下两个类定义。
#include <iostream>
#include <array>
class A
{
public:
virtual void f() = 0;
};
class B : public A
{
public:
virtual void f() { std::cout << i << std::endl; }
int i;
};
这里sizeof(B) == 8,大概是4个虚拟指针和4个int。
现在假设我们创建一个 B 数组,如下所示:
std::array<B, 10> x;
现在我们得到sizeof(x) == 80。
如果我的理解是正确的,所有对x 元素的方法调用都是静态解析的,因为我们在编译时就知道类型。除非我们执行A* p = &x[i] 之类的操作,否则我认为甚至不需要存储虚拟指针。
如果你知道它不会被使用,有没有办法在没有虚拟指针的情况下创建 B 类型的对象?
即一个模板类型nonvirtual<T>,它不包含虚拟指针,并且不能被T的子类型指向?
【问题讨论】:
-
你为什么想要一个?如果您使用虚函数等从
A派生B,那么您一定有一些理由这样做。您显然希望使用A的代码将B视为As。那么你会从中得到什么? -
你为什么要这个?你真的会从剥离虚拟指针中受益吗?如果你愿意,你应该考虑创建另一个非虚拟的
B类。 -
@Dani:我希望能够同时使用同质和非同质集合,同时不为我在同质集合的情况下不使用的东西付费。
-
@Clinton 如果一个类中的单个指针被认为不止一个
int是一个重大损失,您应该阅读一些关于优化的文章。如果您仍然不相信,请在汇编中制作您的项目,您不会相信它需要多少内存(和运行时间)。