目录
- 简介
- 计算类的大小
- 场景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的一个过程
希望对您有一点点帮助,如有错误欢迎小伙伴指正