C++类的虚拟函数表存储在哪里
Where is the virtual function table for C++ class stored?
我试图找到c++类的虚拟函数表的确切存储位置。我找到了一些答案,例如它是"函数指针的静态数组"那么它会存储在数据段只读内存中吗?(初始化一个)
很可能
是的。但是,这不是强制性的。甚至没有强制要求通过虚拟函数表实现多态性,但在大多数平台上都是如此。这些都是实现细节,只要编译器遵守标准设定的行为,它就可以做任何它想做的事情。
vftable
是每个类一个,并且仅存储在内存中的一个位置。
当您将任何函数设为虚拟时,编译器将在您的类中插入一个 vptr。因此,类的大小将增加 4 个字节(在 Win32 上)。此指针保存虚拟表 (vtable) 的地址。vtable 由编译器在编译时构造,基本上只不过是一个函数指针数组。函数指针实际上是指向该特定类的虚函数的指针。更准确地说,虚拟表是函数指针的静态数组,因此同一类的不同实例可以共享该 vtable。由于静态成员存储在数据部分 (.data) 中,因此 vtable 也存储在可执行文件的数据部分。
它是依赖于实现的,是的。
对于 g++(4.9.0),虚拟表(不是指针)存储在 ELF 文件的 .rodata 部分及其相应的段 LOAD 内存中。
相关文章:
- 谷歌测试中的期望值存储在哪里
- 常量参数存储在哪里 (C++)?
- 此递归函数的每次迭代的值存储在哪里?
- 如何告诉本机节点模块所需的dll存储在哪里?
- 模板参数在 C++ 中存储在哪里?
- C++ - thread_local变量存储在哪里?
- 返回值存储在哪里?
- glVertexAttribDivisor 存储在哪里 - VAO、VBO 或全局状态?
- 虚拟函数在哪里使用 vpointer to vtable 来解析方法调用,非虚拟方法存储在哪里以及如何解析它们?
- 为什么类型转换对象不会更改其地址?有关对象类型的信息存储在哪里?
- C++ - 函数中的局部指针变量具有什么类型的存储持续时间以及它们存储在哪里?
- bazel 项目将其".so"文件存储在哪里?
- 返回对象存储在哪里
- OpenSSL dll文件存储在哪里
- 如果我在我的函数中返回一个类,它存储在哪里
- 变量名称存储在哪里
- 引用变量存储在哪里
- 数组的指针,该数组的每个元素的内存空间信息存储在哪里
- 常量数据存储在哪里
- 编译时局部变量存储在哪里