先看如下代码:

#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位来存储的话在看看:

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

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

C++类对象大小问题(一)的更多相关文章

  1. C++类对象大小的计算

    (一)常规类大小计算 C++类对象计算需要考虑很多东西,如成员变量大小,内存对齐,是否有虚函数,是否有虚继承等.接下来,我将对此举例说明. 以下内存测试环境为Win7+VS2012,操作系统为32位 ...

  2. 对C++对象内存模型造成的影响(类/对象的大小)

    首先重新回顾一下关于类/对象大小的计算原则: 类大小计算遵循结构体对齐原则 第一个数据成员放在offset为0的位置 其它成员对齐至min(sizeof(member),#pragma pack(n) ...

  3. static 成员变量、static 成员函数、类/对象的大小

    一.static 成员变量 对于特定类型的全体对象而言,有时候可能需要访问一个全局的变量.比如说统计某种类型对象已创建的数量. 如果我们用全局变量会破坏数据的封装,一般的用户代码都可以修改这个全局变量 ...

  4. c++类对象的内存分布

    要想知道c++类对象的内存布局, 可以有多种方式,比如: 1)输出成员变量的偏移, 通过offsetof宏来得到 2)通过调试器查看, 比如常用的VS 1.没有数据成员的对象 class A{ }; ...

  5. C++一个类对象的大小计算

    计算一个类对象的大小时的规律: 1.空类.单一继承的空类.多重继承的空类所占空间大小为:1(字节,下同): 2.一个类中,虚函数本身.成员函数(包括静态与非静态)和静态数据成员都是不占用类对象的存储空 ...

  6. 一个类的实例化对象所占空间的大小(对象大小= vptr(可能不止一个) + 所有非静态数据成员大小 + Aligin字节大小(依赖于不同的编译器))

    注意不要说类的大小,是类的对象的大小. 首先,类的大小是什么?确切的说,类只是一个类型定义,它是没有大小可言的. 用sizeof运算符对一个类型名操作,得到的是具有该类型实体的大小. 如果 Class ...

  7. Java对象大小计算

    这篇说说如何计算Java对象大小的方法.之前在聊聊高并发(四)Java对象的表示模型和运行时内存表示 这篇中已经说了Java对象的内存表示模型是Oop-Klass模型. 普通对象的结构如下,按64位机 ...

  8. class中new与未new的区别 类对象占用空间--转载

    转载自http://blog.sina.com.cn/shuiwuhendeboke    颗颗的博客 (1)作用域不同 不用new:作用域限制在定义类对象的方法中,当方法结束时,类对象也被系统释放了 ...

  9. C#基础之数组排序,对象大小比较

    从个小例子开始: 1 2 3 int[] intArray = new int[]{2,3,6,1,4,5}; Array.Sort(intArray); Array.ForEach<int&g ...

随机推荐

  1. PHP伪协议-文件包含

    lfi.php案例代码 <?php include $_GET['file']; ?> phar://.zip://.zlib://   用于读取压缩文件,zip:// .phart:// ...

  2. 『与善仁』Appium基础 — 26、常用手机操作的API说明

    目录 1.获取当前手机的时间 2.获取手机屏幕的宽和高 3.获取手机当前网络 4.设置手机网络模式 5.操作手机通知栏 6.综合练习 7.发送键到设备(掌握) 8.手机截图(掌握) 是针对手机一些常用 ...

  3. 【LeetCode】717. 1-bit and 2-bit Characters 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 遍历 日期 题目地址:https://leetcod ...

  4. 【LeetCode】113. Path Sum II 解题报告(Python)

    [LeetCode]113. Path Sum II 解题报告(Python) 标签(空格分隔): LeetCode 作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fu ...

  5. B. Recover the String

    B. Recover the String time limit per test 1 second memory limit per test 256 megabytes input standar ...

  6. Docker 与 K8S学习笔记(十)—— 容器的端口映射

    我们一般将应用部署在容器里面,而一个服务器上会有许许多多的容器,那么外界该如何访问我们的应用呢?答案是:端口映射. Docker可以将容器对外提供服务的端口映射到host的某个端口上,外网通过此端口访 ...

  7. 『学了就忘』vim编辑器基础 — 97、vim使用技巧

    目录 1.在vim中导入其他文件内容或命令结果 (1)导入其他文件内容 (2)在vim中执行系统命令 (3)导入命令结果 2.设定快捷键 3.字符替换 4.多文件打开 vim使用技巧,就是vim编辑器 ...

  8. 「算法笔记」状压 DP

    一.关于状压 dp 为了规避不确定性,我们将需要枚举的东西放入状态.当不确定性太多的时候,我们就需要将它们压进较少的维数内. 常见的状态: 天生二进制(开关.选与不选.是否出现--) 爆搜出状态,给它 ...

  9. null和空字符串对于查询where条件语句的影响

    在数据库中我们进行数据处理的过程中,对于null值或者空字符串的情况对于这种数据我们进行计算平均值以及查询过程中如何进行对于这类数据的处理呢? step1:建表:create table a(id i ...

  10. 在Apache上用mod_wsgi部署Flask (python 3.8, Ubuntu)

    因为项目源码用了一些>python3.5的语法糖,但是Ubuntu的mod_wsgi包对应的是python3.5,所以采用从pip安装mod_wsgi的方法 参考: Flask教程 mod_ws ...