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

可能还是有些困惑的地方,再解释下,看图片:
我的意思也就是不能任由自己随便去读,内存的划分是规定好的,必须按照那个要求来读才可以。
C++类对象大小问题(一)的更多相关文章
- C++类对象大小的计算
(一)常规类大小计算 C++类对象计算需要考虑很多东西,如成员变量大小,内存对齐,是否有虚函数,是否有虚继承等.接下来,我将对此举例说明. 以下内存测试环境为Win7+VS2012,操作系统为32位 ...
- 对C++对象内存模型造成的影响(类/对象的大小)
首先重新回顾一下关于类/对象大小的计算原则: 类大小计算遵循结构体对齐原则 第一个数据成员放在offset为0的位置 其它成员对齐至min(sizeof(member),#pragma pack(n) ...
- static 成员变量、static 成员函数、类/对象的大小
一.static 成员变量 对于特定类型的全体对象而言,有时候可能需要访问一个全局的变量.比如说统计某种类型对象已创建的数量. 如果我们用全局变量会破坏数据的封装,一般的用户代码都可以修改这个全局变量 ...
- c++类对象的内存分布
要想知道c++类对象的内存布局, 可以有多种方式,比如: 1)输出成员变量的偏移, 通过offsetof宏来得到 2)通过调试器查看, 比如常用的VS 1.没有数据成员的对象 class A{ }; ...
- C++一个类对象的大小计算
计算一个类对象的大小时的规律: 1.空类.单一继承的空类.多重继承的空类所占空间大小为:1(字节,下同): 2.一个类中,虚函数本身.成员函数(包括静态与非静态)和静态数据成员都是不占用类对象的存储空 ...
- 一个类的实例化对象所占空间的大小(对象大小= vptr(可能不止一个) + 所有非静态数据成员大小 + Aligin字节大小(依赖于不同的编译器))
注意不要说类的大小,是类的对象的大小. 首先,类的大小是什么?确切的说,类只是一个类型定义,它是没有大小可言的. 用sizeof运算符对一个类型名操作,得到的是具有该类型实体的大小. 如果 Class ...
- Java对象大小计算
这篇说说如何计算Java对象大小的方法.之前在聊聊高并发(四)Java对象的表示模型和运行时内存表示 这篇中已经说了Java对象的内存表示模型是Oop-Klass模型. 普通对象的结构如下,按64位机 ...
- class中new与未new的区别 类对象占用空间--转载
转载自http://blog.sina.com.cn/shuiwuhendeboke 颗颗的博客 (1)作用域不同 不用new:作用域限制在定义类对象的方法中,当方法结束时,类对象也被系统释放了 ...
- C#基础之数组排序,对象大小比较
从个小例子开始: 1 2 3 int[] intArray = new int[]{2,3,6,1,4,5}; Array.Sort(intArray); Array.ForEach<int&g ...
随机推荐
- AcWing1264. 动态求连续区间和 (树状数组做法)
1.题目 给定 n 个数组成的一个数列,规定有两种操作,一是修改某个元素,二是求子数列 [a,b] 的连续和. 输入格式 第一行包含两个整数 n 和 m,分别表示数的个数和操作次数. 第二行包含 n ...
- 【九度OJ】题目1177:查找 解题报告
[九度OJ]题目1177:查找 解题报告 标签(空格分隔): 九度OJ http://ac.jobdu.com/problem.php?pid=1177 题目描述: 读入一组字符串(待操作的),再读入 ...
- 【LeetCode】152. Maximum Product Subarray 解题报告(Python & C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 双重循环 动态规划 参考资料 日期 题目地址:htt ...
- 防止 jar 包被反编译
1.隔离Java程序 最简单的方法就是让用户不能够访问到Java Class程序,这种方法是最根本的方法,具体实现有多种方式.例如,开发人员可以将关键的Java Class放在服务器端,客户端通过访问 ...
- 第三十六个知识点:Index Calculus算法
第三十六个知识点:Index Calculus算法 我们这篇博客继续描述一种数学攻击,这种数学攻击被叫做Index Calculus(IC)算法. 注意这里Index Calculus算法没有找到合适 ...
- Java中关于super关键字的作用
在子类继承父类中,一般有一行super的语句,需要记住三种使用方法: 1.super.变量/对象名: 使用这种方法可以直接访问父类中的变量或对象,进行修改赋值等操作 2.super.方法名(): 直接 ...
- Mysql 设计超市经营管理系统,包括商品信息表(goods) 和 商品类型表(goodstype)
互联网技术学院周测机试题(一) 一 需求分析 为进一步完善连锁超市经营管理,提高管理效率,减少管理成本,决定开发一套商品管理系统,用于日常的管理.本系统分为商品管理.员工管理.店铺管理,库存管理等功 ...
- mysql总结笔记 -- 索引篇
索引的作用 索引是用来高效的获取数据的 排好序 的 数据结构,如果没有索引,可能会导致查询某一条记录的时候遍历整张表:所以适当的索引可以大大的提升检索速度: 索引的数据结构 二叉树 假如说我们有一列数 ...
- 通过 v-once 创建低开销的静态组件
<!DOCTYPE html> <html> <head> <meta charset="utf-8"/> <script s ...
- httprunner2.0 概述及使用说明
一.概述 HttpRunner是一款面向 HTTP(S) 协议的通用测试框架,只需编写维护一份 YAML/JSON 脚本,即可实现自动化测试.性能测试.线上监控.持续集成等多种测试需求. 二.系统流程 ...