当前位置: 首页 > 编程笔记 >

你真的知道C++对象大小吗?

金瑞
2023-03-14
本文向大家介绍你真的知道C++对象大小吗?,包括了你真的知道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++的锁你知道几种?相关面试题,主要包含被问及C++的锁你知道几种?时的应答技巧和注意事项,需要的朋友参考一下 参考回答: 锁包括互斥锁,条件变量,自旋锁和读写锁

  • 本文向大家介绍你知道 标签的target属性规定在何处打开链接文档吗?相关面试题,主要包含被问及你知道 标签的target属性规定在何处打开链接文档吗?时的应答技巧和注意事项,需要的朋友参考一下 _self 自身打开,效果即跳转 _blank 新开标签页打开 _parent 父 _top 顶级 我们常用的恐怕一般只有2种,_blank,_self 另外有个细节是为什么链接是a标签,而不是b,c呢,

  • 本文向大家介绍你真的了解BOM中的history对象吗,包括了你真的了解BOM中的history对象吗的使用技巧和注意事项,需要的朋友参考一下 前面的话   history对象保存着用户上网的历史记录,从窗口被打开的那一刻算起。由于安全方面的考虑,开发人员无法得到用户浏览器的URL,但借由用户访问过的页面列表,可以在不知道实际URL的情况下实现后退和前进。本文将详细介绍BOM中的history对象

  • 本文向大家介绍关于C#结构体 你需要知道的,包括了关于C#结构体 你需要知道的的使用技巧和注意事项,需要的朋友参考一下 结构体概念   在C#中,结构体是值类型,一般适用于表示类似Point、Rectangle、Color的对象   值类型能够降低对堆的管理、使用。降低垃圾回收,表现出更好的性能。可是值类型也有不好的一面。会涉及到装箱拆箱等操作 结构体声明   结构体声明定义了一种新的数据类型,这

  • 问题内容: 为了防止错误共享,我想将数组的每个元素与高速缓存行对齐。因此,首先我需要知道高速缓存行的大小,因此我为每个元素分配了字节数。其次,我希望数组的开头与缓存行对齐。 我正在使用Linux和8核x86平台。首先,我如何找到缓存行大小。其次,如何在C中对齐缓存行。我正在使用gcc编译器。 因此,假设缓存行大小为64,结构将如下所示。 依此类推,假设0-63与高速缓存行对齐。 问题答案: 要知道

  • 本文向大家介绍css中的baseline,你知道吗?相关面试题,主要包含被问及css中的baseline,你知道吗?时的应答技巧和注意事项,需要的朋友参考一下 baseline是西文字体里面的一种定位,vertical-align:baseline是指行内元素里的文字,在垂直方向上,按字体的基线排列,基线就是可以类似我们小学写英文字母时的带线的格子,axec这些字母的底部就是baseline,然后