首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

c++的类为什么占一个字节?我的猜想是为了进行类型识别?

在C++中,类的大小取决于其成员变量的大小和对齐要求。一个字节(byte)通常是8位,即一个字节可以表示从00000000到11111111的256种可能组合。对于C++类来说,它的大小应该足以容纳所有成员变量,同时还要考虑内存对齐的要求。

C++类的内存对齐是为了提高程序的运行效率。对齐要求是基于平台的,例如,32位平台上,对齐通常是4字节。这意味着,如果一个变量的大小是4字节,那么它将被分配到一个4字节的边界上,以确保访问该变量时的性能。

在C++中,类的大小可以通过sizeof()操作符来获取。如果一个类只有一个成员变量,并且该成员变量的大小为1字节,那么该类的大小也应该是1字节。这是因为类的大小应该至少是其成员变量大小的整数倍,以满足内存对齐要求。

总之,C++类的大小取决于其成员变量的大小和对齐要求。如果一个类只有一个成员变量,并且该成员变量的大小为1字节,那么该类的大小也应该是1字节。这是为了满足内存对齐要求,从而提高程序的运行效率。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Block原理详解(一)

__forwarding->a)); return 0; } 发现,加上__block之后,变量会在编译时候被转换成一个__Block_byref_a_0类型结构体,__Block_byref_a...因此,在局部变量前加上__block之后,会生成__Block_byref_a_0类型结构体,这个结构体里面保存了原始变量指针以及原始值,然后将这个__Block_byref_a_0类型结构体传进...block__main_block_impl_0类型结构体构造函数,并且在__main_block_impl_0类型结构体内部保存起来。...descriptor; // // imported variables }; isa指针8个字节,flags和reserved都是int类型4个字节,他们仨一共16个字节。...当然这只是猜想,接下来通过读取寄存器来验证一下: ? 结果表明,x8就是_block_invoke,也就是block函数调用,这就验证了上面的猜想

59710

: 0,a 是 Double 类型,那 b 是什么类型

很遗憾,IntelliJ 告诉我们, b 类型是 Any。 注意,这里是变量 b 类型推导, b 指向内存类型取决于真实内存数据。 为什么会这样?难道发现了一个编译器 Bug? 2....推导类型是 Parent,是合乎情理。 3. 字节码分析 面对这个类型结果差异,瞬间想到了看看字节码, val b = a?...字节码是生成结果,不是类型推导原因,通过这个结果我们只能推测到类型推导结果在第一个那里就被推导为 Any 了。...前面被数值基本类型映射坑了太多把了,所以我想一定是因为后面的那个 0 被识别成了 Java 基本类型 int。 那么我们想办法把这个这个 0 变成装箱类型会怎么样呢?...换句话说,对于两个类型有两个以上没有继承关系公共父(接口)情形,推导结果会有歧义,可能也是为了消除这种歧义,Kotlin 编译器采用了一种比较稳妥方式来处理,不偏袒任何一方,直接将推导结果定为

75510
  • C#序列化对象二进制储存方法及底层原理研究

    占了32位,恰好是4个字节,这也证明string储存形式是 “长度+内容” 继续往后看,最后面还有一个int类型数字27,但是这个27位置很奇怪,他居然是靠左,而刚刚还是靠右。...至于为什么选择16进制,而不是二进制,可能是为了效率,同样一个数2^16,如果除以16,则只需要计算4次,但是如果除以2,则需要计算16次,效率相差了4倍。但是最终不是还要用二进制保存吗?...接下来我们用C++进行下一步实验 图中可以看到,在计算机中保存了0x11223344这个数字,尽管我输入是16进制,但是内存里仍然是按int类型储存。...C++char只占了一个字节,所以我们定义一个char指针,把他指向a,此时p指向是a一个字节,顺序打印p,p+1,p+2,p+3位置数据,发现结果是 44 33 22 11。...我们还发现字符串前面除了有四个字节用来表示数字以外,还有两个字节 06 03,以及第二个字符串前面的 06 04,如果你在里面多定义一个字符串,你会发现字节码里多出一个 06 05,因此我们也可以大胆猜测这是字符串标志

    1.3K10

    关于 Elasticsearch 429 Too Many Requests 排查思考

    报错猜想 生产情况分析 个人认为合理猜想 429报错怎么产生?...tips:这也是为什么叫异常栈了,栈就是先进后出(FILO) 报错猜想 猜想一:调用essearch api,入参有问题,因为看到关于json报错。...请求) 高IO (IO密集型) 频繁写入操作会导致高IO,内存和磁盘,IO密集型建议使用脚本语言进行编码,比如python,相对编码简单,编码效率快。...高CPU(CPU密集型) 频繁查询操作会导致高CPU,CPU,CPU密集型建议使用编译型语言进行编码,比如C、C++、Java和C# es接收请求队列 每个节点都有一个线程池队列,可以容纳若干个请求,...一味调用search接口,没有bulk操作,只会把CPU打满,也不会报429,因为search是CPU密集型操作,而且ES本身就是为了查询分析设计

    2.5K20

    萌新不看会后悔C++基本类型总结(一)

    就是前者4字节,后者8字节,前者有效数字位数位8位,后者为16位,还有就是取值范围不同。...这里有一个误区:在不同编译器,每个类型占用内存可能是不同,这和编译器有关,一个类型占用多少字节由编译器在编译期间决定,并不和系统是否是32位和64位有关,不要以为在16位机器上就是16位,在36位机器上就是...为什么要有这几种书写方式呢,在有些地方是使用八进制或者是十六进制表示,我们可以直接使用该表示方法赋值给number,而不必转换为十进制,总而言之,就是为了方便,为了偷懒,反过来,输入识别进制是有了,反过来...4.有无符号类型之间运算情况        说完sizeof和strlen,继续说基本类型长度,计算机内存基本单位是位(bit),8位为一个字节,每一位有0和1两种组合,也就是说一个字节有 2 *...执行运算时,如果一个运算数是有符号,而另一个是无符号,那么C/C++会隐式将有符号参数强制转换为无符号类型,并假设这两个数都是非负数。

    1.3K41

    内存编织技术,JVM对内存又一次压榨

    为什么这么说呢?往后看。 对于面向对象类型语言来说,有两个很重要概念:、对象。所有信息在编译时就已经确定下来了。...即在创建对象时,为了节省内存,根据不同类型数据,精细化地向内存中填充数据。 为什么说JVM对象实例属性存储机制比C++更难呢?...就变成了24字节,浪费了10字节。 所以高手都知道:定义属性要遵循字节数据类型放前面,字节数据类型放后面。是不是好麻烦?...JVM中实例属性存储 说完了C++对象内存模型,再来说说JVM对象内存模型,两句话: 1、创建对象进行属性编织时,按照8字节、4字节、2字节、1字节、指针顺序进行编织。...其实这里还要一个问题,就是内存是无态,比如对象中有两个int,要取第2个,取时候怎么知道取是哪一个呢?这时候就要找到对象信息,找到信息中存储属性表,然后才能完成取值。

    35720

    Java 学习笔记(1)——java基础语法

    这里想应该是在执行时候,java命令根据名去找对应.class 文件,将文件中二进制字节码放到虚拟机中执行。然后由虚拟机去中查找main函数,从main函数中执行。...java代码执行需要经过两个步骤,首先编译为虚拟机能识别字节码,然后有虚拟机解释并执行这个字节码。所以java具有两面性,即需要编译,也需要解释执行,那么它到底是解释性语言还是编译型呢?...java中char两个字节,所以在C/C++中会将需要一个字节一个字节处理缓冲定义为char型数组,而在java中就不能这么干了,因为它char两个字节,java中对于这种情况一般是定义为byte...由于java中char两个字节,所以java中char是可以表示中文 char c = '中' //这在java中是正确,但是C/C++中不能这么写 有数据类型自然就涉及到数据类型转化问题。...,你代码中采用了字面值常量进行相加,而常量是不会变化,因此在程序运行之前就已经知道计算结果,就没必要在运行时候浪费CPU给你计算这个加法值,直接给你一个结果也是一样

    48920

    CC++中内存对齐问题讲解

    内存对齐规则在C/C++结构体或,存在内存对齐问题。内存对齐是为了方便计算机进行寻址,优化寻址速度一个措施,其代价是消耗不必要内存空间。...根据数据类型在内存中对齐规则,int类型占用4个字节,在内存中占用0,1,2,3地址处,而double类型占用8个字节,需要放在地址偏移量为8位置上。因此,test2大小为16个字节。...接下来,testMemory结构体包含四个成员变量:一个int类型一个long类型一个char类型一个test2类型结构体。...其中,int类型和long类型各占4个字节,char类型1个字节,而test2类型大小为16个字节,所以testMemory大小为4 + 8 + 1 + 16 = 29个字节。...struct默认是public继承因此,对于struct对齐规则同样是class对齐规则,在c++中,还必须注意在存在虚函数时一个虚表指针情况:(在64位中指针大小为8字节,32为4字节) class

    37410

    C++奇迹之旅:探索对象模型内存存储猜想

    就像谜语一样,对谜底来进行描述,谜底就是谜语一个实例。...即使这个没有任何成员变量或成员函数,每个对象也需要在内存中占据至少一个字节空间。这是因为在C++中,每个对象都必须具有唯一内存地址,以便程序能够准确地引用它们。...中仅有成员函数 class A2 { public: void f2() {} }; 即使中仅有成员函数而没有任何成员变量,C++编译器仍然会为该类实例分配至少一个字节内存空间。...根据C++规则,成员函数不会影响大小,因为它们不会被存储在每个对象中。所以,f1() 不会影响 sizeof(A1) 值。 然而, A1 中包含一个 int 类型私有成员变量 _a。...在32位系统上,int 类型通常占用4个字节内存空间。因此sizeof(A1) 大小是4个字节,这个大小正是 _a 大小。

    10410

    Node进阶-探究不在V8堆内存中存储Buffer对象

    想就是因此在 Node.js里面提供了 Buffer处理二进制数据,可以处理各种类型数据。 Buffer模块一个说明。...a0 e5 a5 bd> console.log(buf.toString("utf8")); // 你好 在 NodeJS 中不支持 GB2312 编码,默认支持 UTF-8,在 GB2312 中,一个汉字两个字节...,而在 UTF-8 中, 一个汉字三个字节,所以上面 “你好” Buffer 为 6 个十六进制数组成。...,当成员为字符串时候,如果值是数字会被自动识别成数值类型,如果值不是数字或成员为是其他非数值类型数据,该成员会被初始化为 00。...实在 C++中定义,虽然引用buffer模块可以访问到它,但是不推荐直接操作它,而是用 Buffer替代。

    1K20

    C++初阶】和对象修炼上

    这一专题是C++学习者第一道小坎,将分为上中下三节给大家讲解 和对象上:和对象引入,包括一些细碎知识点,包括面向对象思想,实例化,this指针等 和对象中:和对象中六大默认成员函数中最常用...只是一个类型,并不是一个实体,从得到实体过程就被称为实例化....猜测1:实例化出来一个对象都存放各自成员变量和成员函数 缺点:可以,但是没必要,当对象比较多,同一个实例化出来对象比较多,就会造成不必要空间浪费,猜想不合理 猜想2:同一个实例化出对象都只存放各自成员变量...,成员函数放在公共代码段中 优点:节约了空间.猜想合理且成立 ps:其实仔细一想我们也能理解,我们在C语言中写函数目的就是为了防止重复造轮子,打印你这个数组和打印这个数组,其实都可以只调用一个函数...0,这里为了避免空实例化出来了对象,对象在取地址时出现都为空,(在内存中没有开辟空间却定义出了变量尴尬问题),所以C++中编译器给空和空实例化出对象都给与了一个字节空间大小. 9.隐含this

    68640

    Node进阶-探究不在V8堆内存中存储Buffer对象

    想就是因此在 Node.js里面提供了 Buffer处理二进制数据,可以处理各种类型数据。 Buffer模块一个说明。...a0 e5 a5 bd> console.log(buf.toString("utf8")); // 你好 在 NodeJS 中不支持 GB2312 编码,默认支持 UTF-8,在 GB2312 中,一个汉字两个字节...,而在 UTF-8 中, 一个汉字三个字节,所以上面 “你好” Buffer 为 6 个十六进制数组成。...,当成员为字符串时候,如果值是数字会被自动识别成数值类型,如果值不是数字或成员为是其他非数值类型数据,该成员会被初始化为 00。...实在 C++中定义,虽然引用buffer模块可以访问到它,但是不推荐直接操作它,而是用 Buffer替代。

    72420

    JVM内存模型——运行时数据区特点和作用

    可以说当JVM接手了内存管理事宜之后呢,相对于C++手动控制管理内存,Java降低了开发者门槛,也提高了程序可维护性。那么JVM究竟是如何对内存进行管理?...在编译期间呢,由于每一个方法源码都是确定,而栈帧是根据方法调用来产生。那么可以猜想栈帧内部一些元素是可以确定。比如说有多少个局部变量,局部存储局部变量所需要空间等等。...顾名思义,这里操作数栈就是一个用来存储操作数栈。这里操作数大部分就是方法内变量。 那为什么需要使用操作数栈来对操作数(变量)进行入栈和出栈操作呢? 主要有两个作用,第一点呢就是存储操作数。...我们用一个非常简单例子来说明一下,由于A为抽象,所以C在加载过程中无法确定B具体实现。...我们数据只会存在Eden区、S0或者S1个区域一个区域,也就是S0跟S1肯定有一个是空

    65720

    C++初识-有了对象之后

    前言 无论是在Java还是Python中,都有概念,基本思想是数据抽象和封装,一个定义了一种数据类型以及相关操作。C++是怎样呢?本文将结合C语言,来介绍C++。...乐一乐 问:C++为什么比C厚那么多? 答:有了对象后就是麻烦。 虽然这只是调侃,但不得不承认,C++在语法特性上要比C复杂,因此本文也只是挑选部分内容来阐述。...对于普通数据类型,如int,double等都可以直接初始化为0,那么数据是复杂,我们必须有一个或几个函数用来实现对象初始化,中这样一个或几个函数就是构造函数。...为什么呢?C++标准里规定,为了避免不同对象具有相同地址,对象大小不允许为0。...总结 我们从前面的内容可以看到,与C语言相比,C++至少多了以下特点: 成员函数定义在中,即操作和数据都在中,而不像C语言中数据与操作分离 使用特定函数,即构造函数进行初始化 使用访问说明符来封装

    51210

    一文带你了解c++和c中字符串使用

    ,在这个发展快速时代,不能太固步自封了(这里也是简单介绍一下c++字符串,不会设计到和对象什么,只是和c语言做个对比)。)...字符反映在现实中就是文字、符号、数字等人用来表达字符,反映在编程中字符就是字符类型变量。C++和C语言中都使用ASCII编码对字符进行编程,编码后可以用char型变量来表示一个字符。...主要原因一是int、double等原生类型几个字节和平台有关;二是C语言中除了ADT之外还有UDT(用户数据类型,比如还是rtos实时操作系统中,经常会看到使用typedef来重新给基本数据类型来定义一个自己写代码名称...,这也主要是考虑跨平台因素,因为不同平台常规数据类型大小所占用字节大小是不一样,所以在换了一个平台下,我们就可以不用全部更改大小,只需改这个别名就行),这些用户自定义类型几个字节无法一眼看出,所以用..."linux";定义了一个字符指针p,p4字节,分配在栈上;同时还定义了一个字符串"linux",分配在代码段;然后把代码段中字符串(一共6字节首地址(也就是'l'地址)赋值给p。

    72820

    iOS底层原理总结 - 探寻OC对象本质

    struct NSObject_IMPL { Class isa; }; 那么这个结构体多大内存空间呢,我们发现这个结构体只有一个成员,isa指针,而指针在64位架构中8个字节。...因此结构体占用存储空间为,isa指针8个字节空间+int类型_no4个字节空间+int类型_age4个字节空间共16个字节空间 Student *stu = [[Student alloc] init...也就是说把一个指向oc对象指针,指向这种结构体。由于我们之前猜想,对象在内存中布局与结构体在内存中布局相同,那么如果可以转化成功,说明我们猜想正确。...而对于student对象,我们知道sutdent对象中,包含person对象结构体实现,和一个int类型_no成员变量,同样isa指针8个字节,_age成员变量4个字节,_no成员变量4个字节,刚好满足原则...答:一个指针变量所占用大小(64bit8个字节,32bit4个字节) 对象isa指针指向哪里?

    1.2K50

    嵌入式笔试面试题目系列(二)

    2)用const修饰形参:func(const int a){};该形参在函数里不能改变 3)用const修饰成员函数:该函数对成员变量只能进行只读操作,就是const成员函数是不能修改成员变量数值...被const修饰东西都受到强制保护,可以预防意外变动,能提高程序健壮性。 参考一个大佬回答: 只要一听到被面试者说:"const意味着常数",就知道正在和一个业余者打交道。...(说明:按几字节对齐,是根据结构体最长类型决定,这里是int是最长字节,所以按4字节对齐); 2.使用64位编译 ,int4, char 1, unsigned short 2,char*...8,函数指针8个,由于是64位编译是8字节对齐(说明:按几字节对齐,是根据结构体最长类型决定,这里是函数指针是最长字节,所以按8字节对齐)所以该结构体24个字节。...大多数机器上,调用函数都要做很多工作:调用前要先保存寄存器,并在返回时恢复,复制实参,程序还必须转向一个新位置执行C++中支持内联函数,其目的是为了提高函数执行效率,用关键字 inline 放在函数定义

    69630

    C++与对象深度解析(一):从抽象到实践全面入门指南

    这是因为C++规定每个对象都必须占有唯一地址,即使中没有成员变量。这1字节大小用于确保不同对象在内存中拥有唯一地址。 为什么对象1字节?...确保指针行为一致:即使是空指针,指向不同对象时,它们也必须指向不同内存地址。如果空对象0字节,就无法保证这一点。...这是为了保证每个对象都有唯一内存地址,C++通过分配1字节来实现这一点。 拓展:含有静态成员 如果一个只包含静态成员函数或静态成员变量,该类对象大小依然是1字节。...这是因为 int 变量 _i 要求4字节对齐,而 char 只1字节,因此在 char 后面会插入3个字节填充空间,以便 int 对齐到4字节边界。 拓展解释:为什么需要内存对齐?...这样,char 类型占用 1 字节,int 类型占用 4 字节,总共5字节,没有插入额外填充字节。 写在最后 在这篇文章中,我们深入探讨了C++与对象基础概念。

    12510

    【Python】--- 基础语法(1)

    注意: 和 C++ / Java 等语言不同,Python变量类型不需要显式指定,而是依靠初始化语句,根据初始化类型进行确定。...所以Python中float8字节空间,通常把一个二进制位称为1 bit,8 bit放在一起就称为一字节(byte)。 PS: 关于单精度浮点数和双精度浮点数问题, 我们此处不做过多讨论。...2.4为什么要有这么多类型 不同类型,占用内存空间是不同。 例如:int在内存中默认占据4字节,但可以动态扩容;float类型固定8字节;bool类型只占用1字节。...电脑有 16GB内存空间,也就是一共有 1024 * 1024 * 1024 * 8这么多二进制位。 不同类型,对应能够进行操作也是不同。...C++/Java这样语言则不允许这样操作。一个变量定义后类型就是固定了。这种特性则称为静态类型

    7810

    关于JVM中几大面试题

    ,这时候就是赋我们给予值了 ---- 什么是符号引用,什么又是直接引用 可以这样进行理解,我们有一个A和B,A中使用到了B字节码中,会用一个符号代表这是B,这就是符号引用 而在B...可以理解为,他是由字节码中一个指针指向另一个字节码。比如说定义了一个String属性,那么在加载连接阶段,常量池中会存储这么一个指针常量。...局部变量表中存储基本单元为变量槽(Sot),32位(4字节)以内数据类型一个slot,64位(long,double)两个slot。...如执行复制、交换、求和等操作 动态链接:每个栈帧都包含一个指向运行时常量池中该栈帧所属方法引用,持有这个引用是为了支持方法调用过程中动态链接。...本地方法栈:由于Java是由C++语言编写,里面肯定会调用到C++,故本地方法栈就是存储是调用C++方法时变量存储。 三、最后 是半月,你我一同共勉!!!

    14120
    领券