首页
学习
活动
专区
工具
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的函数调用,这就验证了我上面的猜想。

61610

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

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

76210
  • 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.4K10

    关于 Elasticsearch 429 Too Many Requests 的 排查思考

    报错的猜想 生产情况分析 我个人认为合理的猜想 429报错怎么产生的?...tips:这也是为什么叫异常栈了,栈就是先进后出(FILO) 报错的猜想 猜想一:调用es的search 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.7K20

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

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

    1.4K41

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

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

    35920

    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给你计算这个加法值,我直接给你一个结果也是一样的。

    49720

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

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

    10910

    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

    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

    42010

    【C++指南】一文总结C++类和对象【上】

    类是对象进行一种抽象描述,是一个模型一样的东西,限定了类有哪些成员变量,这些成员变量只是声明,没有分配空间,用类实例化出对象时,才会分配空间。...struct A { int a; int b; char c; }; 根据内存对齐规则:第一个成员a在与结构体偏移量为0的地址处,占4个字节。...成员b先对齐到对齐数的整数倍处,占4个字节;成员c同理。总占9个自己,由于需要对齐到最大对齐数的整数倍,因此结构体总大小为12。 那结构体内没有成员呢?...struct A { }; 运行后发现 A类对象的大小是1 ,为什么没有成员变量还要给1个字节呢?因为如果一个字节都不给,表示不了对象存在过,作用是为了占位标识对象存在。...• 编译器编译后,类的成员函数默认都会在形参第⼀个位置,增加一个当前类类型的指针,叫做this 指针。

    9000

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

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

    69640

    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替代。

    73020

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

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

    67220

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

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

    75720

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

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

    51610

    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个字节,刚好满足原则...答:一个指针变量所占用的大小(64bit占8个字节,32bit占4个字节) 对象的isa指针指向哪里?

    1.2K50

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

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

    71530

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

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

    8110

    关于JVM中的几大面试题

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

    14520
    领券