内存静态函数与成员函数

类A(说),具有所有静态成员函数只有类B(说)只有成员函数

如果我创建1000个A类实例。由于类只包含静态成员函数,因此即使存在1个实例或1000个实例,内存也不会增加。

但是,对于B类。如果我创建1000个实例,是否会增加内存(即使是最轻微的,可能是指向成员函数集的每个对象的指针)?

如果不是,那么编译器如何保存跟踪特定对象的成员函数信息?


对于初学者,你可以尝试输出sizeof(A)sizeof(B) 。 但有几件事要牢记:

  • 无论成员的数量或类型如何,C ++都禁止一个类的大小为0,所以静态成员与否, A每个实例都会占用一些内存; 和

  • 非虚函数的解析完全是在编译时完成的,所以编译器不需要为它添加任何内容。 (虚拟函数通常会将一个指针的大小添加到类中,而不管您的类有多少个虚函数。)


  • 是否会增加内存(即使是最轻微的,可能是指向成员函数集的每个对象的指针)?

    没有。
    非虚拟成员函数不会影响某个类的对象的大小。
    但是,虚拟成员函数的存在通常会增加类对象的大小。

    请注意,后者是纯粹实现的具体细节,但由于所有已知的编译器都使用v-tablev-ptr来实现虚拟机制,因此可以合理地假设几乎所有的编译器都会显示向每个对象添加v-ptr的相同行为的多态类,从而按v-ptr大小增加类对象的大小。


    如果我们只是谈论成员职能,那么印记将是相同的。 一个成员函数不会占用更多的内存,它所包含的类会被实例化(因为this指针被传递给它)。 只有类的数据成员才会在每个类实例化时占用更多的内存,因为它们对于类的每个实例都是唯一的。

    因此,为了回答第二个问题,它会在调用类的非静态成员函数时通过传递this指针的用户“跟踪”。

    虚拟方法让事情变得更加复杂,但是你的问题并没有涉及到这个特定的习惯用法。

    链接地址: http://www.djcxy.com/p/17299.html

    上一篇: Memory static function vs member function

    下一篇: C++ static constant string (class member)