2016-04-17 119 views
13

对于那些使用vtables的编译器实现:是否有任何情况下虚拟函数表在运行时更改?或者vtable只在编译时被填充,并且在运行时没有执行修改它们的操作?在运行时修改Vtable

+2

你设想什么的运行时类型的修改是有用/可能吗? –

+2

@ Cheersandhth.-Alf如果它是一个简单的C++程序比没有,这是愚蠢的。但如果他(现在或将来)必须写VM或interperter/JIT编译器之类的东西,那么我就不会如此迅速地抛弃他的问题 –

+0

这是imp ...很难想出这样的设计,线程安全,所以没有完成。 –

回答

8

我不是利用了虚拟表在运行时更改多态性的实现知悉任何C++ ABI的。无论如何,由于虚拟表通常描述代码的属性(成员函数与类层次结构中的每个其他w.r.t.位置的关系),并且C++代码在运行时不会更改,所以它不会非常有用。

而且因为它不会有用,这将是浪费。

+0

是否虚函数表走在execurable图像中的代码段或数据段? –

+2

@KarolisM ilieška:在哪些实施?你为什么需要知道? –

+0

具体:ARM Keil,但这也适用于gcc arm。 1.我只是很好奇,2.我使用嵌入式系统,有时需要知道在哪里放置某些部分。 –

2

简短的回答是否定的。

稍微长一点(也可能是特定于实现的)答案是,对象的实际vtable指针在派生多态类的构造函数和析构函数的执行过程中发生变化,因此派生类中的重写方法无法执行通过基类的构造函数/析构函数,而派生类尚未构造/已被破坏。

如果你希望对象在运行时更改类,那么你有多种选择:

  1. 的Objective-C(++)

  2. 手工编写自己的调度机制

  3. python/javascript等等。

  4. (最好的选择)重新考虑你的设计。

+1

这不是变化的vtable。这是破坏对象的vptr成员! –

+0

另外,'std :: function'可以在运行时重新分配,所以这是另一个选项 –

+0

@KerrekSB固定,虽然我确定有更好的措辞 –