我试图找到为c ++类存储的虚拟函数表的确切位置。 我找到了一些答案,比如它的“静态函数指针数组” 它会被存储在数据段只读存储器中吗? (初始化一个)
答案 0 :(得分:2)
最有可能是的。但是,它没有强制要求。它甚至没有强制要求多态性通过虚函数表实现,但在大多数平台上都是如此。这些是实现细节,只要编译器服从标准设置的行为,它就可以做任何想做的事情。
vftable
是每个类一个,只存储在内存中的一个位置。
答案 1 :(得分:1)
当你创建任何虚函数时,编译器会在你的类中插入一个vptr。结果,类的大小将增长4个字节(在Win32上)。该指针保存虚拟表的地址(vtable)。 vtable是由编译器在编译时构造的,基本上只是一个函数指针数组。函数指针实际上是指向该特定类的虚函数的指针。更确切地说,虚拟表是函数指针的静态数组,因此同一类的不同实例可以共享该vtable。由于静态成员存储在数据部分(.data)中,因此vtable也存储在可执行文件的数据部分中。
答案 2 :(得分:0)
依赖于实现,是的。
对于g ++(4.9.0),虚拟表(不是指针)存储在ELF文件的.rodata部分及其对应的段LOAD中。