zoukankan      html  css  js  c++  java
  • 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位来存储的话在看看:

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

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

  • 相关阅读:
    JavaScript创建对象
    php 用户访问菜单页面,必须登录,判断用户是否登录
    ThinkPHP 3.1.2 控制器的模块和操作
    商业智能数据营销该怎么做?
    HTML::Entities 编码或解码 HTML 实体的字符串
    perl 处理json 数组格式
    打开redis服务提示
    Windwos 08R2_DNS+AD安装图文
    Windwos 08R2_DNS+AD安装图文
    单选按钮和标签组合点击
  • 原文地址:https://www.cnblogs.com/SunShine-gzw/p/13207529.html
Copyright © 2011-2022 走看看