C++类对象大小问题(一)

先看如下代码:

#include<iostream>
using namespace std;
class Base1
{
public:
};
class Base2
{
public:
    char ch;
};
class Base3
{
public:
    int ch;
};
class Base4
{
public:
    char ch;
    int sh;
};
int main()
{
    cout << "sizeof(Base1)=" << sizeof(Base1) << endl;
    cout << "sizeof(Base2)=" << sizeof(Base2) << endl;
    cout << "sizeof(Base3)=" << sizeof(Base3) << endl;
    cout << "sizeof(Base4)=" << sizeof(Base4) << endl;
    while (1);
    return 0;
}

输出:

分析:

sizeof(Base1)=1:虽然Base1是一个空类,但是通过它可以生成一个对象,既然可以生成对象,那么必然需要空间来保存它,所以有了那个1字节的存在。(计算机最小内存编址单元为字节,所以最小也只能是1个字节)。

sizeof(Base2)=1:在类里加入了类型为char的数据,它自己本身的大小为1个字节,   那加上类的大小,那不应该是2个字节吗?这里的原因是由于char数据和类Base2共用内存空间的缘故,如下图所示:

 sizeof(Base3)=4: 这里换个大一点的int类型在做实验,发现总的大小也不是1+4=5个字节,而是4个字节,说明也是共用了空间,如下图所示:

 sizeof(Base4)=8;  如果和上面情况一样考虑的话,按理应该是1+4=5个字节,这里为什么是8个字节。下面先看图:

这里是为了内存对齐的需求,如果这样来安排数据的话,机器读取内存的速度就会变快,说白了就是用空间换时间。

具体的内存对齐说清楚不容易,但是先来看看内存不对齐:

所谓的内存不对齐,就是一个成员变量需要多个机器周期去读的现象,下面我用图来解释一下:以32位机为例:

如果按照5字节去存储的话,如果去读int变量的话,需要读两次才可以读入到内存。

如果按照8位来存储的话在看看:

可能还是有些困惑的地方,再解释下,看图片:

 我的意思也就是不能任由自己随便去读,内存的划分是规定好的,必须按照那个要求来读才可以。

原文地址:https://www.cnblogs.com/SunShine-gzw/p/13207529.html