C++类占用内存大小知识总结
(3)一个类至少占用一个字节大小;
(4)虚函数:不管几个虚函数,sizeof()都是多了4个字节;
(5)类里只要有一个虚函数(或者说至少有一个虚函数),这个类会产生一个指向虚函数的指针
有两个虚函数,那么这个类就会产生两个指向虚函数的的指针。
虚函数表是基于类的,跟着类走,因为有了虚函数的存在,导致系统在类中添加了一个指针;
这个指针正好指向虚函数表,这个指针叫做vptr; 这个vptr的值由系统在适当的时机(比如构造函数中通过增加额外的代码来给值)
总结:
a:对于类中静态数据成员不计算在sizeof内;
b:普通的成员函数和静态成员函数不计算在类的对象的sizeof内
c:虚函数不计算在内的sizeof()内,但是虚函数会让类对象增加4字节的大小,以容纳虚函数表指针;
d;虚函数表[vtbl]是基于类的(跟着类走,跟对象没关系,不是基于对象的);
e:如果有多个数据成员,那么为了提高访问速度,某些编译器可能将数据成员之间的内存占用比例进行调整;(内存数据对齐)
f:不管什么类型指针 char *p ,int *q;该指针占用的内存大小是固定的;如sizeof(char *)=4,sizeof(int *)=4;在其他平台可能是8字节(linux平台)。
class MyClass { public: MyClass(); ~MyClass(); float getValue()const { return m_value; }; static void setcount(int c) { m_count = c; }; virtual void func() {}; protected: int ab; float m_value; static int m_count; private: }; MyClass::MyClass() { } MyClass::~MyClass() { } using namespace std; //类对象所占用的空间大小 int main() { // std::cout << "Hello World!\n"; MyClass obja; int size = sizeof(obja ); cout << size << endl; return 1; }
结果:12