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位来存储的话在看看:
可能还是有些困惑的地方,再解释下,看图片:
我的意思也就是不能任由自己随便去读,内存的划分是规定好的,必须按照那个要求来读才可以。