c++内存模型 虚函数内部的具体内存划分具体情况
时间: 2023-09-18 13:01:39 浏览: 96
c++中的内存模型包括四个部分:栈区、堆区、全局/静态区、常量区。而虚函数的内存划分则涉及vptr表和vtable表。
首先,栈区是用于存储局部变量、函数参数和函数调用时的临时数据。虚函数的调用会先找到对象的虚函数表指针vptr,然后通过vptr找到虚函数表vtable。而vptr是属于对象的一部分,它存储在对象的内存布局中的最开始位置。这意味着vptr会占用对象的内存空间。
vtable表是一个指针数组,它存储了虚函数的地址。在vtable表中,每个虚函数的地址根据其在类中的声明顺序进行排列。当通过vptr找到vtable后,就可以通过虚函数在vtable表中的位置偏移找到对应的虚函数的地址。虚函数的地址存储在vtable表的字节中,这些字节也会占用对象的内存空间。
在堆区,存储的是通过new关键字动态分配的内存。当对象动态分配内存时,vptr会随着对象的内存块一起存储在堆中。
在全局/静态区,存储的是全局变量和静态变量。由于全局变量和静态变量是整个程序共享的,它们的内存布局中不包含vptr和vtable。
最后,常量区存储的是程序中的字符串常量和其他常量。常量区的内存布局中也不包含vptr和vtable。
总的来说,虚函数的内部具体内存划分包含vptr和vtable表,它们存储在对象的内存空间中,占用一定的字节。而全局/静态区、常量区和堆区中的内存布局则不包含有关虚函数的内存划分。
阅读全文