为什么在运行时调用虚函数需要虚表?
Why the need of virtual tables on calling virtual functions at runtime?
我一直在关注 this tutorial,试图了解 virtual table
以及 pointer
和 virtual functions in C++
背后的整个过程。
不确定,当我有这样的代码时:
D1 d1;
Base *dPtr = &d1;
dPtr->function1();
为什么我需要所有这些 virtual table
管理?为什么编译器根本不分配 d1
的内存地址(或基地址,如果没有的话)覆盖 virtual function
?
我的意思是:如果它需要 D1 functon1()
地址或 Base functon1()
地址,它可以在编译时详细说明。那个时候就知道了。为什么稍后在运行时查看 virtual tables
会浪费时间和资源?
我想念这一点。想举个例子吗?
这是我的功能:
void foo(Base *pBase) {
pBase->function1();
}
我单独编译,给你一个带头文件的目标文件。在您甚至梦想 D1
之前几个月。编译器怎么会"use the address of D1's function1 directly"这里?
不能。这就是为什么需要某种形式的间接寻址。
除此之外,虚函数 table 并不是 必需的 ,因为每个 C++ 实现都会使用虚函数。它只是当今编译器采用的最流行的实现技术。
我一直在关注 this tutorial,试图了解 virtual table
以及 pointer
和 virtual functions in C++
背后的整个过程。
不确定,当我有这样的代码时:
D1 d1;
Base *dPtr = &d1;
dPtr->function1();
为什么我需要所有这些 virtual table
管理?为什么编译器根本不分配 d1
的内存地址(或基地址,如果没有的话)覆盖 virtual function
?
我的意思是:如果它需要 D1 functon1()
地址或 Base functon1()
地址,它可以在编译时详细说明。那个时候就知道了。为什么稍后在运行时查看 virtual tables
会浪费时间和资源?
我想念这一点。想举个例子吗?
这是我的功能:
void foo(Base *pBase) {
pBase->function1();
}
我单独编译,给你一个带头文件的目标文件。在您甚至梦想 D1
之前几个月。编译器怎么会"use the address of D1's function1 directly"这里?
不能。这就是为什么需要某种形式的间接寻址。
除此之外,虚函数 table 并不是 必需的 ,因为每个 C++ 实现都会使用虚函数。它只是当今编译器采用的最流行的实现技术。