虚函数表指针的大小是多少?

时间:2011-08-17 16:40:42

标签: c++ virtual-functions

在单一继承中,指向虚拟表的指针的大小是否始终等于void*的大小?说,

class vft { virtual ~vft(); }
assert (sizeof(vft) == sizeof(void*));

这种说法总是真的吗?

5 个答案:

答案 0 :(得分:3)

不,虚拟主义是实施定义的。它是一个编译器实现细节 所以你不能说永远都是真的。

此外,您应该避免编写任何代码(如问题中的那个代码),该代码假定标准作为编译器实现细节保留一个细节,因为这使得您的代码在编译器和编译器之间不能100%可移植。甚至可能在一些编译器上彻底失败。

答案 1 :(得分:2)

C ++ ISO标准首先没有提及虚函数表指针。编译器可以遵循这种机制来支持运行时多态性,或者可以提出任何其他甚至不涉及vptr的机制。它完全取决于编译器编写者。由于标准没有对vptr说什么,它怎么说它的大小?没门。结论是:你所做的(或假设的)不是由语言保证的。但是,对于编译器,可能始终为true。

作为旁注,对于您的编译器,您如何得出结论sizeof(vft)将等于sizeof(vptr)?它很可能是sizeof(vft) > sizeof(vptr)。虽然我没有声称。

答案 2 :(得分:1)

这与实现有关。

答案 3 :(得分:0)

“这种说法总是真的吗?”取决于“永远”的意思。

正如其他人已经指出的那样,这是一个实现细节,即使使用相同编译器的不同版本也可能会发生变化。 C ++标准对此一无所知,所以你不能依赖它。

另一方面,我从来没有见过编译器,这不是真的。

答案 4 :(得分:0)

除了其他人已经指出的事实之外,我觉得标准确实给了一些保证。即,class vft { void* a, b; virtual ~vft(); }然后sizeof(vft) > sizeof(void*)。我很确定标准至少可以保证虚拟功能还是没有。