大家好,又见面了,我是全栈君。
1.对于C++中的类的内存占用,存在一个很容易出现错误的点。就是:当一个类中并没有定义任何的成员变量也没有定义虚函数的时候,内存的占用情况,代码如下:
class MyClass
{
public:
MyClass();
~MyClass();
//virtual void fun() {}; // 4
private:
//int a; // 4
//char b; // 1
//double c; // 8
};
MyClass::MyClass()
{
}
MyClass::~MyClass()
{
}
int main()
{
// test03
std::cout << "size int :" << sizeof(int) << " size char:" << sizeof(char) << " size double:" << sizeof(double) << std::endl;
std::cout << "size MyClass:" << sizeof(MyClass) << std::endl;
}
各位看官们,你们觉得结果会是如何呢?
没错,结果并不是0而是1,这个没有定义任何成员变量也没有定义任何的虚函数的类占用的是一个字节内容。
size int :4 size char:1 size double:8
size MyClass:1
那么只是为什么呢?
因为对于没有数据成员的对象,其内存单元也不是0,c++用一个内存单元来表示这个实例对象的存在。
2.C++中的类的内存对齐方式,到底是以几个字节作为对齐标准呢?4个?8个?又或者是更多呢?代码如下,各位看官猜一猜吧。
class MyClass
{
public:
MyClass();
~MyClass();
//virtual void fun() {}; // 4
private:
int a; // 4
char b; // 1
//double c; // 8
};
MyClass::MyClass()
{
}
MyClass::~MyClass()
{
}
int main()
{
// test03
std::cout << "size int :" << sizeof(int) << " size char:" << sizeof(char) << " size double:" << sizeof(double) << std::endl;
std::cout << "size MyClass:" << sizeof(MyClass) << std::endl;
}
输出如下:
size int :4 size char:1 size double:8
size MyClass:8
4个字节作为对齐?没错,在这个情况下是以4个字节作为对齐的,但是真的就是都是以4个字节作为内存对齐的标准的吗?其实并不是的,再看看下面的代码吧。
class MyClass
{
public:
MyClass();
~MyClass();
//virtual void fun() {};
private:
//int a; // 4
char b; // 1
double c; // 8
};
MyClass::MyClass()
{
}
MyClass::~MyClass()
{
}
int main()
{
// test03
std::cout << "size int :" << sizeof(int) << " size char:" << sizeof(char) << " size double:" << sizeof(double) << std::endl;
std::cout << "size MyClass:" << sizeof(MyClass) << std::endl;
}
输出结果如下:
size int :4 size char:1 size double:8
size MyClass:16
这下懵逼了吧,现在的内存对齐的标准又变成了8个字节了,其实并不然。C++中的类的对齐的字节,并不是一个定数,而是以类中的成员变量占用的字节数最大的类型作为对齐标准的。
3.同时还有一个极为容易忽略的占用内存类型(虚函数表),注意类有虚函数指针,别忘了虚函数指针还有4字节,代码如下:
class MyClass
{
public:
MyClass();
~MyClass();
virtual void fun() {
};
private:
//int a; // 4
//char b; // 1
//double c; // 8
};
MyClass::MyClass()
{
}
MyClass::~MyClass()
{
}
int main()
{
// test03
std::cout << "size int :" << sizeof(int) << " size char:" << sizeof(char) << " size double:" << sizeof(double) << std::endl;
std::cout << "size MyClass:" << sizeof(MyClass) << std::endl;
}
输出结果会是多少呢?4?错了,并不是4,而是8.
size int :4 size char:1 size double:8
size MyClass:8
为什么占用8个字节呢?因为这个就和第一个易错点有联系了,因为现在这个类内部并没有定义有成员数据,c++用一个内存单元来表示这个实例对象的存在,这一个内存字节,因为存在虚函数表(4个字节),所以经过内存对齐之后,这个类所占用的内存大小就是8了,而不是4了。
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/115091.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...