c ++成员函数和类大小

时间:2013-01-15 21:23:44

标签: c++

  

可能重复:
  Why class size, depends only on data members and not on member functions?

当我第一次学习继承时,我的老师评论说,与数据成员相反,成员函数不会改变类的大小。也就是说,如果B类继承自A类,那么B的大小将大于A的大小,当且仅当至少添加一个数据成员时,并且不会相对于函数成员数量进行更改。 这是对的吗?如果是这样,这个机制如何运作?似乎两个成员都应该被保留在堆中,因此会花费大小。

谢谢你, 盖

3 个答案:

答案 0 :(得分:2)

成员变量存储为每个类实例的一部分。但成员函数不是。

每个类的实例必须具有每个成员变量的单独副本。这使每个对象保持唯一。

但成员函数是代码。无论你有多少个特定类的实例,都没有理由拥有多个代码副本。相同的代码只是对实例数据进行操作。

由于代码不同,代码不是类实例大小的一部分。并且sizeof(myClass)将不包含代码占用的字节。

答案 1 :(得分:1)

  

如果B类继承自A类,则B的大小将大于   A的大小当且仅当至少添加一个数据成员时,和   不会因功能成员数量而改变。

是的,这是对的。 (如果B没有实现其他方法)。 每个类实例都有一个数据成员的副本和一个指向实际存储它们的成员函数表的指针。

成员函数的代码在同一个类的不同实例之间共享。如果B不覆盖基类A的任何成员函数,则A和B都可以共享相同的方法。 当您覆盖子类中的成员函数时,基本上您正在更改此机制,创建覆盖成员函数的新定义,仅适用于您定义它的子类(es.B)。

通常,成员函数在编译时绑定。因此,如果您通过指向基类A的指针引用了子类B的实例,并且调用了在两个类中定义的成员函数foo(),则调用的函数将是在基类中实现的函数。 您可以强制成员函数在运行时绑定,将其声明为虚拟(调用的成员函数将是通过基指针指向的类的实际类型之一)。这将导致另一个表(虚拟方法表,vtable)用于存储虚方法,并且每个调用都有一个双指针间接。

答案 2 :(得分:1)

您可以想象调用成员函数myClass.myMethod(x)myMethod(myClass, x)类似。每个类的实例都不需要存在该函数。您可以使用this关键字访问此“隐藏”的第一个参数。