建立一个类占用的字节数

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Jaster_wisdom/article/details/82143326

本文主要讲解在C++中建立一个新类会占用的字节数,这是面试中经常会被问的一道题。

1.建立一个空类,里面什么都没有,没有成员函数,也没有成员变量;

#include <iostream>
using namespace std;

class Person{
    
};

int main(){
    cout<<sizeof(Person)<<endl;
    return 0;
}

返回的结果是:

所以说,建立一个空的类,占用一个字节数。因为C++要求每个实例在内存中都要有独一无二的地址。

2.类中有成员变量(非静态),没有静态成员变量和成员函数

#include <iostream>
using namespace std;

class Person{
private:
    int weight;
    int height;
};

int main(){
    cout<<sizeof(Person)<<endl;
    return 0;
}

结果是:

这很容易解释,因为int型占用4个字节,两个int就占用8个字节。那空类的那1个字节去哪里了? 那个字节是隐藏的,当有成员变量或虚函数占用空间时,它就消失了。

3.类中含有静态成员变量

#include <iostream>
using namespace std;

class Person{
private:
    static int weight;
    int height;
};

int main(){
    cout<<sizeof(Person)<<endl;
    return 0;
}

结果:

哦,原来静态的成员变量不占用字节数。为什么会不占用字节数呢?因为静态成员变量不在类的内部空间,而在类的外部静态区,所以计算类的大小时,是不包含静态变量的大小的。

4.类中只有普通成员函数

#include <iostream>
using namespace std;

class Person{
public:
    void eat();
};

int main(){
    cout<<sizeof(Person)<<endl;
    return 0;
}

结果:

可以看出,普通函数是不占用类的内存空间的。因为我们访问类的成员函数,是通过eat(Person.this)来调用的,也就是说,通过这个this指针指向一个table,这个table保存的是各个成员函数的地址。

5.类中存在虚函数

#include <iostream>
using namespace std;

class Person{
public:
    void eat();
    virtual void run();
};

int main(){
    cout<<sizeof(Person)<<endl;
    return 0;
}

在32位系统中,结果是4; 在64位系统下是8。  这个大小也就是虚函数表指针的大小。无论有多少个虚函数,无论衍生出多少个子类,都只存在一个虚函数表的指针。这个指针存放的是虚函数表在内存中的地址。

6.类中数据对齐处理

#include <iostream>
using namespace std;

class Person{
public:
    void eat();
private:
    char sex;
    int height;
    int weight;
};

int main(){
    cout<<sizeof(Person)<<endl;
    return 0;
}

结果是:

虽然有一个char类型,本身只占一个字节,但是为了和int对齐,自动变为和int 相同的大小,所以占用的字节数为12

阅读更多
换一批

没有更多推荐了,返回首页