在单一继承中,指向虚拟表的指针的大小是否始终等于void*
的大小?说,
class vft { virtual ~vft(); }
assert (sizeof(vft) == sizeof(void*));
这种说法总是真的吗?
答案 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*)
。我很确定标准至少可以保证虚拟功能还是没有。