编译器和v表

时间:2018-01-29 10:10:47

标签: c++ polymorphism virtual vtable

我知道虚函数和动态多态如何工作。我知道编译器会在基类中添加一个v-ptr,它将由后续的派生类继承。此外,编译器将为每个类创建v表,并将保留关于每个类的大多数派生版本的虚函数的函数指针。

现在,我的问题是这个v表存储在哪里?它在代码段吗?从哪里为这些表分配内存。请分享内部细节。

我也知道实现可能因编译器而异。但是可以在他/她的回答中提到一个特定的编译器和特定于该编译器的实现。

1 个答案:

答案 0 :(得分:0)

确实,它取决于编译器和平台。 Linux上的GCC将它们放在ELF文件的.rodata段中。 Visual C ++将它们放在EXE / DLL文件的.rdata段中。

在这两种情况下,内存都没有在任何地方分配,它是从执行文件映射的内存,就像代码一样。