一、空类大小
class A
{
};
void main()
{
A a;
cout <<"sizeof(a):"<< sizeof(a) << endl;
system("pause");
}
结果:

从结果可以看出,空类的大小是1,这是为了空类可以被实例化,并且每个实例在内存中都有独一无二的地址,因此,编译器会给空类隐含加上一个字节,这样空类实例化之后就会拥有独一无二的内存地址。如果没有这一个字节的占位,那么空类就无所谓实例化了,因为实例化的过程就是在内存中分配一块地址。
注意:当该空白类作为基类时,该类的大小就优化为0了,这就是所谓的空白基类最优化。
注意:空白基类最优化无法被施加于多重继承上只适合单一继承。
class A
{
};
class B :public A
{
};
void main()
{
A a;
cout <<"sizeof(a):"<< sizeof(a) << endl;
B b;
cout << "sizeof(b):" << sizeof(b) << endl;
system("pause");
}
结果:

二、成员函数对类大小的影响
class A
{
public:
void go()
{
}
void go1()
{
}
void go2()
{
}
};
void main()
{
A a;
cout <<"sizeof(a):"<< sizeof(a) << endl;
system("pause");
}
结果:

从结果可以看出,成员函数不占用类对象的空间
三、成员非静态变量对类对象空间大小的影响
class A
{
public:
void go()
{
}
void go1()
{
}
void go2()
{
}
int ax;
};
void main()
{
A a;
cout <<"sizeof(a):"<< sizeof(a) << endl;
a.ax = 100;
system("pause");
}
结果:

从结果可以看出非静态变量占用空间。

四、静态变量对类对象大小的影响
class A
{
public:
void go()
{
}
void go1()
{
}
void go2()
{
}
static int x;
};
int A::x = 1;
void main()
{
A a;
cout << sizeof(a) << endl;
system("pause");
}
结果:

从结果可看出,静态成员变量部占用类对象的空间。
五、虚函数对类对象大小的影响
class A
{
public:
void go()
{
}
void go1()
{
}
void go2()
{
}
virtual void go3()
{
}
};
void main()
{
A a;
cout << sizeof(a) << endl;
system("pause");
}
结果:

从结果可以看出加入了虚函数会增加四个字节,其实这四个字节就是指向虚函数表的指针(VPTR)
深入理解类与函数对C++对象大小的影响及虚函数的内存开销

本文探讨了C++中空类大小、成员函数、非静态变量、静态变量和虚函数对类对象内存占用的细节,揭示了不同元素如何影响实例化后的内存布局。特别关注了空类优化、静态成员变量与动态成员的区别,以及虚函数表的内存消耗。
3038

被折叠的 条评论
为什么被折叠?



