在单一继承中,指向虚拟表的指针的大小总是等于void*
的大小?说,虚拟函数表指针的大小是多少?
class vft { virtual ~vft(); }
assert (sizeof(vft) == sizeof(void*));
这个断言总是对的吗?
在单一继承中,指向虚拟表的指针的大小总是等于void*
的大小?说,虚拟函数表指针的大小是多少?
class vft { virtual ~vft(); }
assert (sizeof(vft) == sizeof(void*));
这个断言总是对的吗?
C++ ISO标准没有提到虚拟功能表指针。编译器可以遵循这种机制来支持运行时多态,或者可以提出任何其他甚至不涉及vptr
。它完全取决于编译器编写者。由于该标准没有说明关于vptr
的任何内容,它怎么能说它的大小?没门。结论是:你所做的(或假设的)不被语言所保证。但是,对于编译器而言,其可能总是为0,即。
作为你的编译器的旁注,你怎么能得出结论sizeof(vft)
将等于sizeof(vptr)
?这很可能是sizeof(vft) > sizeof(vptr)
。尽管如此,我并没有声称。
不,虚拟主义是实现定义的。这是一个编译器实现细节。
所以你不能说永远是真的。
而且,你应该写任何代码(如一个在问题)不要自己,假设是开放的标准作为一个编译器实现细节的细节,因为这使你的代码不是100%的可跨编译器&甚至可能会在一些编译器上大幅失败。
这是依赖于实现的。
“这个说法总是对的吗?”取决于你的意思是“永远”。正如其他人已经指出的那样,这是一个实现细节,即使对于同一个编译器的不同版本,它也可能会发生变化。 C++标准没有提到它,所以你不能依赖它。
另一方面,我从来没有见过一个编译器,这不会是真的。
我有。在早期,虚拟表格仍在测试中,并且使用了其他技术。 –
除了其他人已经指出的事实,我觉得标准确实提供了一些保证。即,对于class vft { void* a, b; virtual ~vft(); }
,然后sizeof(vft) > sizeof(void*)
。我敢肯定,这个标准至少保证了虚拟功能或者没有。
我认为它至少是实现(编译器)的依赖,所以并非总是如此。虽然这可能是合理的假设,但我相信你在进入vptr时会陷入危险的境地。 –
不存在虚拟表或虚拟表指针(与C++相关)。断言这种事物的存在是没有意义的。 –