C ++中成员函数的内存分配

时间:2010-10-08 06:03:07

标签: c++

#include<iostream>
using namespace std;
class A
{

};
class B
{
        public:
                void disp()
                {
                        cout<<" This is not virtual function.";
                }
};
class C
{
        public:
                virtual void disp()
                {
                        cout<<"This is virtual function.";
                }
};
int main()
{
        cout<<"class A"<<sizeof(A)<<endl;
        cout<<"class B"<<sizeof(B)<<endl;
        cout<<"class C"<<sizeof(C)<<endl;
        return 0;
}

sizeof类A和B类都只是1个字节。关于B中成员函数disp的内存分配。

4 个答案:

答案 0 :(得分:23)

对于类的每个实例,内存仅分配给其成员变量,即类的每个实例都不会获得它自己的成员函数副本。所有实例共享相同的成员函数代码。您可以将其想象为编译器为每个成员函数传递隐藏的 this 指针,以便它对正确的对象进行操作。在您的情况下,由于C ++标准明确禁止0大小的对象,因此A类和B类的最小可能大小为1.对于C类,由于存在虚函数,因此C类的每个实例都将具有指向其v的指针-table(这是特定于编译器的)。所以这个类的sizeof将是sizeof(指针)。

答案 1 :(得分:1)

非虚拟成员函数不需要在任何地方“分配”;它们基本上可以被视为具有类实例的隐式第一个参数的普通非类函数。它们通常不会增加班级大小。

答案 2 :(得分:1)

任何类的大小取决于类中变量的大小,而不是函数。函数只在调用时在堆栈上分配空间,并在返回时弹出。所以类的大小通常是非静态成员变量大小的总和......

答案 3 :(得分:0)

非虚函数不属于类的内存。该函数的代码被烘焙到可执行文件中(非常类似于静态成员),并且在调用它时为其变量分配内存。该对象仅携带数据成员。