b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

【每日一题】C++里的虚函数是什么?

电脑杂谈  发布时间:2021-05-25 12:03:40  来源:网络整理

一直不清楚C ++内存是如何划分的。我只知道大致分为堆区域,堆栈区域,全局静态区域,常量区域等。如果我没记错的话,似乎有一个代码区域。

现在的问题是C ++中的虚函数是通过虚函数表实现的。包含虚函数的类的对象具有指向虚函数的指针(通常是对象的前4个字节(32位))。

那么,虚拟功能表存储在存储器的哪一部分?

我检查了Internet上的一些信息,但无法弄清楚,所以我必须做自己的研究。

首先,进行简单分析。虚函数表应该在编译时就已确定,因此它不能在堆区和堆栈区中。虚函数不是代码的一部分,因此假定它位于静态区域或恒定区域中。

有一个简单的测试想法。编写一个简单的C ++程序,输出每个部分的地址和虚函数表的地址,并根据该地址的位置进行判断。

代码如下:

#include 
#include 
using namespace std;
typedef void (*FP)();
FP fp;
void fun() {
    int t;
    printf("〇〇〇栈区:0xX\n", (unsigned)&t);
}
class Base {
    public:
    virtual void gao() {
        printf("Base\n");
    }
    virtual ~Base() {}
};
class Derived : Base {
public:
    virtual void gao() {
        printf("Derived\n");
    }
    virtual void dio() {
        printf("URYYYYYY\n");
    }
    virtual ~Derived() {}
};
Base b;
Derived d;
int glob = 0;
int glob2 = 0;
const int cons = 0;
int main()
{
    int stk = 0;
    int stk2 = 0;
    const char *p = "123456";
    const char *p2 = "3333";
    unsigned table = *((unsigned*)&b);
    unsigned table2 = *((unsigned*)&d);
    printf("sizeof(void*) %d\n", sizeof(void*));
    char *heap =(char *) malloc(100);
    char *heap2 = new char[100];
    printf("〇〇〇栈区:0xX\n", (unsigned)&stk);
    printf("〇〇〇栈区:0xX\n", (unsigned)&stk2);
    fun();
    fp = fun;
    printf("〇〇函数区:0xX\n", (unsigned)&(*fp));
    printf("〇〇常量区:0xX\n", (unsigned)&(*p));
    printf("〇〇常量区:0xX\n", (unsigned)&(*p2));
    printf("〇〇常量区:0xX\n", (unsigned)&cons);
    printf("〇虚函数表:0xX\n", table);
    printf("〇虚函数表:0xX\n", table2);
    printf("全局静态区:0xX\n", (unsigned)&glob);
    printf("全局静态区:0xX\n", (unsigned)&glob2);
    printf("〇〇〇堆区:0xX\n", (unsigned)&(*heap));
    printf("〇〇〇堆区:0xX\n", (unsigned)&(*heap2));
    return 0;
}

运行后输出结果:

sizeof(void *)4

〇〇〇堆栈区域:0x0029FEE4

〇〇〇堆栈区域:0x0029FEE0

〇〇〇堆栈区域:0x0029FE7C

〇〇功能区域:0x00401334

〇〇恒定面积:0x0040E04E

〇〇恒定区域:0x0040E055

〇〇恒定区域:0x0040E0D0

〇虚拟功能表:0x0040FCD0

〇虚拟功能表:0x0040FCE8

全局静态区域:0x00411014

全局静态区域:0x00411018

〇〇〇堆区域:0x00830DF0

〇〇〇堆区域:0x00830E60

推测存储器分为以下几个部分:

堆栈区功能区(功能区是代码区吗?)恒定区虚拟功能表(虚拟功能表属于哪个部分?)全局静态区堆区

因此,虚拟功能表位于常量区域和全局区域之间。似乎虚拟函数表可以用作单独的分区,也许内存划分方法没有想象中那么严格。

检查信息,然后再添加。


本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/shoujiruanjian/article-377988-1.html

    相关阅读
      发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

      热点图片
      拼命载入中...