c++ 中的每个对象是不是包含不同版本的类成员函数?

Posted

技术标签:

【中文标题】c++ 中的每个对象是不是包含不同版本的类成员函数?【英文标题】:Does each object in c++ contain a different version of the class's member functions?c++ 中的每个对象是否包含不同版本的类成员函数? 【发布时间】:2020-11-11 17:40:24 【问题描述】:

我只是好奇,在 C++ 中创建对象会为其成员函数的新副本分配空间吗?在不存在类的程序集或机器代码级别,来自同一类的不同对象的所有对特定函数的调用是否实际上引用了相同的函数指针,或者内存中有多个函数块,因此每个函数都有不同的指针从同一个类派生的每个对象的成员函数?

【问题讨论】:

【参考方案1】:

通常语言尽可能简单地实现功能。

类方法实际上只是包含对象指针作为参数的简单函数,其中对象实际上只是数据结构+可以对该数据结构进行操作的函数。

通常编译器知道哪个函数应该对对象进行操作。 但是,如果存在函数可能被覆盖的多态性情况。 然后编译器不知道类的类型是什么,它可能是 Derived1 或 Derived2。 然后编译器将向该对象添加一个 VTable,其中将包含指向可能已被覆盖的函数的函数指针。 然后对于可覆盖的方法,程序将在此表中查找以查看应该执行哪个函数。

您可以通过查看 C 中如何实现多态来了解它是如何实现的: How can I simulate OO-style polymorphism in C?

【讨论】:

【参考方案2】:

不,它没有。函数是类范围的。当您在 C++ 中分配一个对象时,它将包含其所有属性的空间以及一个带有指向其所有方法/函数的指针的 VTable,无论是从自己的类还是从父类继承。

当您在该对象上调用方法时,实际上是在该 VTable 上执行查找并调用相应的方法。

【讨论】:

vtable 仅用于虚函数。如果一个类没有虚函数,它就没有 vtable。 嗯,你说得对。我不确定编译器如何处理非虚拟类,但方法肯定是类范围的。

以上是关于c++ 中的每个对象是不是包含不同版本的类成员函数?的主要内容,如果未能解决你的问题,请参考以下文章

C++中的类所占内存空间总结

总结5

何时为 C++ 中的类的成员函数分配内存空间?

访问包含在数组中的指向类对象的类成员函数的正确语法是啥?

C++,成员函数返回对包含指向 const 对象的指针的向量的 const 引用

如何创建 C++ 用户定义的类,以便该类的 std::vector 不包含该类的某些成员