你真的知道C++对象大小吗?
我们都直到char大小为1,int为4,那么C++中对象的大小是多少呢?
看三个问题:
- C++中函数占不占对象的大小
- 空类的大小是多少?
- 如果类中有虚函数,类的大小是多少?
一,C++中函数占不占对象的大小
看一段代码:
可以看出,类的大小即为类的属性a的大小为4,函数并不占对象的大小。
那么这个的原因是什么呢?
原因:
这样定义的好处就是为了节省空间的大小。
假设此时类中有10个函数,类又定义了100个对象。如果每个对象都包含一个函数的大小,那么就需要占用1000个函数空间的位置,这样极大的消耗了资源。
实际上类的函数是放在代码区的,哪个对象需要调用函数,则从代码区调用,因为函数并不是对象独有属性,所以并不冲突,这样仅仅占10个函数空间位置就够了。
这样一对比,函数放在代码区节省了很多的资源,因此函数并不占用对象的大小。
至于对象放的位置,如果new的就在堆区,不然就在栈区。
二,空类的大小是多少?
看代码:
我们会发现,空类的大小变成了1,正常不应该是0吗?
这样设置的原因是因为每一个对象实例化都需要空间,这里系统默认给了一个占位符,占1字节大小
三,如果类中有虚函数,类的大小是多少?
看图片:
对比上面两种情况,空类大小为1,但是函数又不占用空间,为什么函数变为虚函数却变成了4呢?
因为当有虚函数时,编译器会给这个类加上虚函数指针 vptr(32位是4,64位是8)
此时类中有了指针,因此对象的大小就变为了4。
上面就是类中不同情况的大小。
总结
到此这篇关于你真的知道C++对象大小的文章就介绍到这了,更多相关C++对象大小内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!
相关推荐
-
C++使struct对象拥有可变大小的数组(详解)
首先摘录<Inside The C++ Object Model>中的一段话: 把单一元素的数组放在一个struct的尾端,于是每个 struct objects 可以拥有可变大小的数组: struct mumble { char pc[1]; }; //获取一个字符串,然后为struct本身和该字符串配置足够的内存 struct mumble *pmumbl = (struct mumble*)malloc(sizeof(struct mumble) + strlen(string) + 1
-
你真的知道C++对象大小吗?
我们都直到char大小为1,int为4,那么C++中对象的大小是多少呢? 看三个问题: C++中函数占不占对象的大小 空类的大小是多少? 如果类中有虚函数,类的大小是多少? 一,C++中函数占不占对象的大小 看一段代码: 可以看出,类的大小即为类的属性a的大小为4,函数并不占对象的大小. 那么这个的原因是什么呢? 原因: 这样定义的好处就是为了节省空间的大小. 假设此时类中有10个函数,类又定义了100个对象.如果每个对象都包含一个函数的大小,那么就需要占用1000个函数空间的位置,这样极大的消
-
JavaScript获得指定对象大小的方法
本文实例讲述了JavaScript获得指定对象大小的方法.分享给大家供大家参考.具体如下: function objectSize(the_object) { /* function to validate the existence of each key in the object to get the number of valid keys. */ var object_size = 0; for (key in the_object){ if (the_object.hasOwnPro
-
C#基础之数组排序、对象大小比较实现代码
从个小例子开始: 复制代码 代码如下: int[] intArray = new int[]{2,3,6,1,4,5}; Array.Sort(intArray); Array.ForEach<int>(intArray,(i)=>Console.WriteLine(i)); 这个例子定义了一个int数组,然后使用Array.Sort(arr)静态方法对此数组进行排序,最后输出排序后的数组.以上例子将毫无意外的依次输出1,2,3,4,5,6. 为什么Array的Sort方法可以正确的对i
-
Java比较对象大小两种常用方法
引入原因: Java中的对象,正常情况下,只能进行比较:== 或!= ,不能使用 < 或 > ,但是在开发时需要用到比较对象的大小 1.Comparable接口的使用(自然排序) 1.像String .包装类等实现了Comparable接口,重写了compareTo()方法,给出了比较两个对象大小的方法 2.像String .包装类等重写了compareTo()方法后,默认执行了从小到大的排序 3.重写compareTo()的规则: 如果当前对象this大于形参对象obj,则返回正整数,如果当
-
Java比较两个对象大小的三种方法详解
目录 一. 为什么需要比较对象 二. 元素的比较 1. 基本类型的比较 2. 引用类型的比较 三. 对象比较的方法 1. equals方法比较 2. 基于Comparable接口的比较 3. 基于Comparator接口的比较 4. 三种比较方式对比 一. 为什么需要比较对象 上一节介绍了优先级队列,在优先级队列中插入的元素必须能比较大小,如果不能比较大小,如插入两个学生类型的元素,会报ClassCastException异常 示例: class Student{ String name; in
-
C++如何计算结构体与对象的大小
如何计算结构体的大小 其实计算一个结构的大小的方法并不难,简单来说就是把结构体内的所有成员的大小相加就可以.但是,需要内存对齐那么究竟什么是内存对齐,又为什么要进行类型对齐呢? 结构体的内存对齐 结构体内存对齐主要有两个步骤: 1.结构体各成员对齐. 2.结构体总体对齐 结构体内存对齐规则: 1.结构体的第一个成员在存放在结构体偏移量为0的位置 2.其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处.. 对齐数 = 编译器默认的一个对齐数与该成员大小的较小值. /* **VS中默认的值为8
-
深入聊聊MySQL中各种对象的大小长度限制
目录 标识符的长度限制 权限表中范围字段的长度限制 数据库和表的数量限制 表大小的限制 字段数量和数据行大小的限制 字段数量限制 数据行大小限制 数据行大小限制示例 总结 今天给大家介绍一下 MySQL 8.0 中的各种对象的大小.长度以及数量限制. 标识符的长度限制 下表描述了各种不同类型标识符的最大长度. 标识符 最大长度(字符) 数据库 64(包括 NDB Cluster 8.0.18 以及更高版本) 表 64(包括 NDB Cluster 8.0.18 以及更高版本) 字段 64 索引
-
浅谈Python 对象内存占用
一切皆是对象 在 Python 一切皆是对象,包括所有类型的常量与变量,整型,布尔型,甚至函数. 参见stackoverflow上的一个问题 Is everything an object in python like ruby 代码中即可以验证: # everythin in python is object def fuction(): return print isinstance(True, object) print isinstance(0, object) print isinst
-
JS获取当前网页大小以及屏幕分辨率等
效果如下: 代码如下: <html> <head> <title>获取当前对象大小以及屏幕分辨率等</title> <body> <div style=" width:88%;margin:30px auto; color:blue;" id="div_html"> </div> <script type="text/javascript"> var
-
解析Java程序中对象内存的分配和控制的基本方法
一.对象与内存控制的知识点 1.java变量的初始化过程,包括局部变量,成员变量(实例变量和类变量). 2.继承关系中,当使用的对象引用变量编译时类型和运行时类型不同时,访问该对象的属性和方法是有区别的. 3.final修饰符特性. 二.java变量的划分与初始化过程 java程序的变量大体可以分为成员变量和局部变量,成员变量可以分为实例变量(非静态变量)和类变量(静态变量),一般我们遇到的局部变量会在下列几种情况中出现: (1)形参:在方法签名中定义的局部变量,由调用方为其赋值,随着方法结束消
随机推荐
- Access保留字&变量名列表
- bootstrap滚动监控器使用方法解析
- 正则表达式的基本知识
- 深入浅析C语言中堆栈和队列
- JavaScript对象数组如何按指定属性和排序方向进行排序
- Javascript实现多彩雪花从天降散落效果的方法
- 详解Java设计模式之备忘录模式的使用
- 纯JS实现简单的日历
- javascript编码的几个方法详细介绍
- jquery实现轮播图效果
- js和jQuery设置Opacity半透明 兼容IE6
- jQuery中:input选择器用法实例
- 详解Spring Boot中MyBatis的使用方法
- C# Guid.NewGuid获得随机数
- javascript asp教程第五课--合二为一
- 关于利用RabbitMQ实现延迟任务的方法详解
- 关于expdp任务异常的处理案例详析
- mybatis使用pageHelper插件进行查询分页
- Vue-cli3.x + axios 跨域方案踩坑指北
- Python及Pycharm安装方法图文教程