目录
- 简介
 - 计算类的大小
 - 场景1:空类
 - 场景2
 - 场景3:含有虚函数
 - 场景4:继承
 - 场景5:存在字节对齐的情况
 
- 总结
 - 结语
 

简介
Hello!
非常感谢您阅读海轰的文章,倘若文中有错误的地方,欢迎您指出~
ଘ(੭ˊᵕˋ)੭
昵称:海轰
标签:程序猿|C++选手|学生
简介:因C语言结识编程,随后转入计算机专业,获得过国家奖学金,有幸在竞赛中拿过一些国奖、省奖…已保研
学习经验:扎实基础 + 多做笔记 + 多敲代码 + 多思考 + 学好英语!
唯有努力💪
本文仅记录自己感兴趣的内容
计算类的大小
场景1:空类
#include <bits/stdc++.h>
using namespace std;
class A
{
};
int main()
{
    int m;
    cout << "sizeof(A) = " << sizeof(A) << endl;
    return 0;
}
 

场景2
#include <bits/stdc++.h>
using namespace std;
class A
{
public:
    int a;
    int b;
public:
    void print()
    {
        cout << "I am haihong." << endl;
    }
};
int main()
{
    int m;
    cout << "sizeof(int) = " << sizeof(m) << endl; // 1个int 大小为4
    cout << "sizeof(A) = " << sizeof(A) << endl;   // 类A的大小为8 = 4 + 4,因为有两个int,函数print并没有占空间
    A a;
    cout << "sizeof(a) = " << sizeof(a) << endl;
    return 0;
}
 

场景3:含有虚函数
#include <bits/stdc++.h>
using namespace std;
class A
{
    virtual void print() {
        cout << "I am haihong." << endl;
    }
};
int main()
{
    int m;
    cout << "sizeof(A) = " << sizeof(A) << endl;
    return 0;
}
 

注:
- 虚函数那里有一个指针,指向虚函数表,所以此时类大小含有一个指针
 - 在32位系统,一个指针4字节;64位系统,一个指针8字节
 
那么两个虚函数呢?
测试:
#include <bits/stdc++.h>
using namespace std;
class A
{
    virtual void print(){};
    virtual void test(){};
};
class B : public A
{
    void print()
    {
        cout << "I am ****." << endl;
    }
};
int main()
{
    int m;
    cout << "sizeof(int) = " << sizeof(m) << endl;
    cout << endl;
    cout << "sizeof(A) = " << sizeof(A) << endl;
    cout << endl;
    cout << "sizeof(B) = " << sizeof(B) << endl;
    return 0;
}
 
结果还是一个指针的大小

 原因:当类含有虚函数时,存在一个指针指向一个虚函数表,这个虚函数表可以有多个虚函数,但是指针只需要一个来指向这个表即可
场景4:继承
#include <bits/stdc++.h>
using namespace std;
class A
{
    virtual void print() {
        cout << "I am haihong." << endl;
    }
};
class B : public A {
    void print() {
        cout << "I am ****." << endl;
    }
};
int main()
{
    int m;
    cout << "sizeof(A) = " << sizeof(A) << endl;
    cout << endl;
    cout << "sizeof(B) = " << sizeof(B) << endl;
    return 0;
}
 

注:
- 在继承后,子类也是含有一个指针,指向虚函数表
 
场景5:存在字节对齐的情况
#include <bits/stdc++.h>
using namespace std;
class A
{
    virtual void print()
    {
        cout << "I am haihong." << endl;
    }
    int a;
};
class B : public A
{
    void print()
    {
        cout << "I am ****." << endl;
    }
};
int main()
{
    int m;
    cout << "sizeof(int) = " << sizeof(m) << endl;// 4
    cout << endl;
    cout << "sizeof(A) = " << sizeof(A) << endl;// 16
    cout << endl;
    cout << "sizeof(B) = " << sizeof(B) << endl;// 16
    return 0;
}
 

这里class A有一个指针(指向虚函数表),还有1个int类型
开始以为A大小为8+4 = 12
后面运行发现为16
然后又测试A中含有两个int类型时
#include <bits/stdc++.h>
using namespace std;
class A
{
    virtual void print()
    {
        cout << "I am haihong." << endl;
    }
    int a;
    int b;
};
class B : public A
{
    void print()
    {
        cout << "I am ****." << endl;
    }
};
int main()
{
    int m;
    cout << "sizeof(int) = " << sizeof(m) << endl;// 4
    cout << endl;
    cout << "sizeof(A) = " << sizeof(A) << endl;// 16
    cout << endl;
    cout << "sizeof(B) = " << sizeof(B) << endl;// 16
    return 0;
}
 
发现结果也是16

琢磨了一会才反映过来,class与struct差不多,存在内存对齐,这样就好理解了
内存对齐具体概念请自行查阅
注:
- 考虑类大小时,还要考虑内存对齐
 
后面又测试:虚表指针的位置对类大小有影响吗
#include <bits/stdc++.h>
using namespace std;
class A
{
	//顺序: int ptr int
    int a;
    virtual void print()
    {
        cout << "I am haihong." << endl;
    }
    int b;
};
class B : public A
{
    void print()
    {
        cout << "I am ****." << endl;
    }
};
int main()
{
    int m;
    cout << "sizeof(int) = " << sizeof(m) << endl;
    cout << endl;
    cout << "sizeof(A) = " << sizeof(A) << endl;
    cout << endl;
    cout << "sizeof(B) = " << sizeof(B) << endl;
    return 0;
}
 
发现结果无影响

继续测试:除了虚表指针外,其他类型顺序对大小有变化吗
分别是
    char c1;
    int a;
    char c2;
    int b;
 
    char c1;
    char c2;
    int a;
    int b;
 
测试代码1:
#include <bits/stdc++.h>
using namespace std;
class A
{
    char c1;
    int a;
    char c2;
    int b;
};
class B : public A
{
    void print()
    {
        cout << "I am ****." << endl;
    }
};
int main()
{
    int m;
    cout << "sizeof(int) = " << sizeof(m) << endl;
    cout << endl;
    cout << "sizeof(A) = " << sizeof(A) << endl;
    cout << endl;
    cout << "sizeof(B) = " << sizeof(B) << endl;
    return 0;
}
 

 测试代码2:
#include <bits/stdc++.h>
using namespace std;
class A
{
    char c1;
    char c2;
    int a;
    // char c2;
    int b;
};
class B : public A
{
    void print()
    {
        cout << "I am ****." << endl;
    }
};
int main()
{
    int m;
    cout << "sizeof(int) = " << sizeof(m) << endl;
    cout << endl;
    cout << "sizeof(A) = " << sizeof(A) << endl;
    cout << endl;
    cout << "sizeof(B) = " << sizeof(B) << endl;
    return 0;
}
 

发现是有影响的,具体与struct内存计算是一样的(自行查阅)
总结
计算类大小时,需要考虑
- 是否存在虚函数,有则说明存在一个指针指向虚函数表
 - 子类继承父类,父类含有虚函数时,子类其实也是有指向虚表的指针的
 - 还要考虑内存对齐的情况(顺序是有关的,这里虚表指针顺序则无影响)
 
结语
文章仅作为个人学习笔记记录,记录从0到1的一个过程
希望对您有一点点帮助,如有错误欢迎小伙伴指正



















