有几个关于vptr和exe的问题:
1) vTable 何时创建并填充,即编译时或运行时?
2) 编译器是否将 vptr 放入 exe 中,即 exe 的大小随 no 的增加而增加。具有虚函数的类
3)当我们运行它并且它包含虚拟函数时,可执行文件的大小是否会增加
最佳答案
这都是定义的实现,并且会因编译器的不同而有所不同,该标准没有提到应该如何实现动态分派(dispatch),甚至没有使用 vtable 和 vpointer 这两个词,但是所有已知的编译器都通过 vtable 实现动态分派(dispatch)并假设您的问题的答案是:
vTable 何时创建并填充,即编译时或运行时?
编译时间
在编译阶段为每个类创建至少一个虚拟方法的 vtable。
编译器是否将 vptr 放入 exe 中,即 exe 的大小随 no 的增加而增加。具有虚函数的类?
是的,很有可能
由于vtable必须驻留在内存中的某个地方,它肯定会占用一些内存空间。
当我们运行它并且它包含虚拟函数时,可执行文件的大小是否会增加?
不,exe 的运行时不会增长。
只有函数的分派(dispatch)发生在运行时,使分派(dispatch)发生的机制是在编译时构造的。
关于C++ 虚函数和可执行文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9111335/