2011-08-17 72 views
1

在单一继承中,指向虚拟表的指针的大小总是等于void*的大小?说,虚拟函数表指针的大小是多少?

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

这个断言总是对的吗?

+0

我认为它至少是实现(编译器)的依赖,所以并非总是如此。虽然这可能是合理的假设,但我相信你在进入vptr时会陷入危险的境地。 –

+0

不存在虚拟表或虚拟表指针(与C++相关)。断言这种事物的存在是没有意义的。 –

回答

2

C++ ISO标准没有提到虚拟功能表指针。编译器可以遵循这种机制来支持运行时多态,或者可以提出任何其他甚至不涉及vptr。它完全取决于编译器编写者。由于该标准没有说明关于vptr的任何内容,它怎么能说它的大小?没门。结论是:你所做的(或假设的)不被语言所保证。但是,对于编译器而言,其可能总是为0,即

作为你的编译器的旁注,你怎么能得出结论sizeof(vft)将等于sizeof(vptr)?这很可能是sizeof(vft) > sizeof(vptr)。尽管如此,我并没有声称。

+0

哦,'vft'只是一个随机的名字:) – neuront

+0

@neuront:我知道它的“随机”名字。我的观点是,为什么班级的大小应该等于'vptr'的大小?在你的例子中,'vft'是一个类名。 – Nawaz

+0

只是在我心中的另一个假设... – neuront

3

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

而且,你应该写任何代码(如一个在问题)不要自己,假设是开放的标准作为一个编译器实现细节的细节,因为这使你的代码不是100%的可跨编译器&甚至可能会在一些编译器上大幅失败。

1

这是依赖于实现的。

0

“这个说法总是对的吗?”取决于你的意思是“永远”。正如其他人已经指出的那样,这是一个实现细节,即使对于同一个编译器的不同版本,它也可能会发生变化。 C++标准没有提到它,所以你不能依赖它。

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

+0

我有。在早期,虚拟表格仍在测试中,并且使用了其他技术。 –

0

除了其他人已经指出的事实,我觉得标准确实提供了一些保证。即,对于class vft { void* a, b; virtual ~vft(); },然后sizeof(vft) > sizeof(void*)。我敢肯定,这个标准至少保证了虚拟功能或者没有。