int,该类型用于表示64位整数,共8字节,请注意与C++中的long long区分 在C99 版本以前,C语言中是没有这些类型的,然而,C99并不是一个被广泛支持的C语言版本,例如微软旗下的VC编译器就坚决不支持...输出的是8字节,在其他类Unix操作系统上一致,可见Windows系统上的C存在很多奇怪的特殊现象。...int height = 0; 8 float price = 0.0f; 9} C语言还有一种在一行声明多个变量并初始化的方式,请警惕这其中的陷进 1 int a, b, c=10; 以上代码中...建议在声明时都进行零值初始化 1 int a = 0, b = 0, c = 10; 为什么在大量的C教材中,都存在先声明,后初始化的代码范例呢?...6 int main(void){ 7 printf("%f",PI); 8 } 注意,以上实际上是定义了一个宏,它并不是我们所说的那种真正意义上的常量,但它的效果等同于常量,而且在某种时候这种方式比使用
在大多数系统上,一个 int 类型的成员变量通常占用 4 个字节(但这不是绝对的,取决于平台和编译器)。因此,sizeof(A1) 应该是 4(或可能是 4 的倍数,取决于内存对齐)。...VS中默认的对齐数为8 3. 结构体总大小为:最大对齐数(所有变量类型最大者与默认对齐参数取最小)的整数倍。 4....:在 C++ 中,可以使用 alignas 关键字或特定的编译器指令(如 GCC 的 __attribute__((aligned(n))))来指定结构体的对齐参数。...:可以通过检查一个整数类型(如 int)的字节顺序来测试机器的大小端。一种常见的方法是创建一个整数,其高位字节设置为 1,其他字节设置为 0,然后检查该整数在内存中的地址处存储的值。...有没有遇到过要考虑大小端的场景?:在处理跨平台的数据交换、网络通信或文件存储时,经常需要考虑大小端问题。因为不同的硬件平台可能使用不同的大小端模式,所以必须确保数据在发送和接收时的大小端一致性。
那我们可以得到的结论是,结构体类型的大小并不是单纯的成员变量类型大小之和,而且结构体类型的大小还跟成员顺序有关系。这是为什么呢?...其实,结构体的成员在内存中是存在对齐现象的。 接着我们就来探讨一下上面两个结构体类型的大小为什么是8个字节和12个字节。...用结构体类型 struct S1 创建一个结构体变量s,假设s从第0个字节开始,我们知道s的大小是8个字节,那其成员n、c1、c2分别在哪个位置呢?...= 编译器默认的一个对齐数 与 该成员变量大小的较小值,VS中默认的值为8,Linux中gcc没有默认对齐数,对齐数就是成员自身的大小...而int型大小是4个字节最大32位,所以不能超过这个数。 为什么要有位段呢? 以前我们在写代码的时候,有没有想过这样一个问题。
C语言 -- 叫你一声你敢答应嘛》的 2.3 部分讲到 char 字符型,占用一个字节;而 int 整型,通常反映了所用机器中整数的最自然长度。那一个字节和机器中整数的最自然长度到底是多大的呢?...在基本类型中的整数类型、浮点数类型和字符类型在之前介绍过了;其中的_Bool是布尔型,只能取 0 和 1 两个值;另一个是枚举类型(enum),这个类型将在后面的部分进行介绍。...对于 int 类型的变量来说,有四种表示长度的限定符(除int本身外,还有 short,long 和 long long),再加上符号位的限定signed和 unsigned,所以一共存在着 8 种int...因此一个字节所能存储的最大数字是二进制的11111111。那这个二进制的数字对应十进制的数字是多少呢?是不是 255 呢?你可以先思考一下再看下面的内容~ ?...如下图为正数 7 和负数 -7 的补码 ? 一个字节的有符号数的取值范围如下图所示 ? 其中我们可以看到负数最高可以到 -128,而正数最高只能到127,这是为什么呢?
用一句话通俗的说就是:所谓内存对齐就是让数据在内存中存储时占用内存的大小(字节数)是按一定值的整数倍去存储。...在计算机体系结构中,访问未对齐的内存地址可能导致性能下降,甚至在某些体系结构上引发硬件异常。...内存对齐的规则通常涉及以下几个方面: 基本对齐规则: 数据的起始地址必须是其大小的整数倍。例如,一个4字节的整数应该从4的倍数地址开始,一个8字节的双精度浮点数应该从8的倍数地址开始。...结构体对齐规则: 在结构体中,每个成员的偏移量必须是其自身大小的整数倍。为了满足这个规则,编译器通常在结构体的成员之间插入填充字节,以保证对齐。...# 以gcc为例 gcc -malign-double my_program.c 注意:这些编译器选项可能因编译器版本而有所不同,建议查阅相应编译器的文档以获取准确的信息。
有读者对字节对齐还有些疑问,这里分享一篇旧文。 字节对齐是我们初学C语言就会接触到的一个概念,但是到底什么是字节对齐?对齐准则又是什么?为什么要字节对齐呢?字节对齐对我们编程有什么启示?...a; char b; int c; short d; }; int main(int argc,char *argv) { /*在32位和64位的机器上,size_t的大小不同...),可以看到,结构体test 的大小为16字节,而不是11字节(a占4字节,b占1字节,c占4字节,d占2字节) #64位机器上编译32位程序可能需要安装一个库 #sudo apt-get install...sizeof(int)大小整除),因此在b后面填充了3个字节,使得c的偏移为8。...在b后面填充后,d已经满足对齐要求了,为什么最后还要填充字节呢?或者说,为什么需要满足第三条准则呢?
JIT技术是JVM中最重要的核心模块之一。因为不断有朋友问起,Java到底是怎么运行的?既然Hotspot是C++写的,那Java是不是可以说运行在C++之上呢?...那么,JVM在加载了这些class文件以后,针对这些字节码,逐条取出,逐条执行,这种方法就是解释执行。 还有一种,就是把这些Java字节码重新编译优化,生成机器码,让CPU直接执行。...所以 edi 里存的其实就是第一个参数,也就是整数 3,为什么使用rdi的低32位,也就是 edi 呢?因为我们的入参 a 是 int 型啊。大家可以换成 long 型看看效果。...第四句,把上一步存到栈上的那个整数再存进 eax 中。 第五句往后,把 eax 加上 1, 然后就退栈,返回。按照x64的规定(ABI),返回值通过eax传递。...解释器,C1和C2 在Hotspot中,解释器是为每一个字节码生成一小段机器码,在执行Java方法的过程中,每次取一条指令,然后就去执行这一个指令所对应的那一段机器码。
runtime Objective-C编程语言是C语言的超集,在C语言的基础上加入了面向对象的内容。OC可以和C/C++混合使用,OC对象都可以转化为C/C++结构体表示。...按理来说NSObject对象需要的内存大小只要能够满足存放一个指针大小就可以了,一个指针变量在64位的机器上大小是8个字节(我们只讨论64位的机器大小),也就是说只要有8个字节的内存空间就能满足存放一个...那是不是说一个NSObject对象就占用8个字节大小的内存呢?实际上不是这样的。我们需要分清楚两个概念,对象占用的内存空间和对象实际利用的内存空间。...,这里的最大成员变量是指针变量(8个字节),结构体的最终的大小需要是8的整数倍,所以结果是16而不是12。...我们可以在Animal类中增加一个int成员变量,此时新的对象实际需要的内存和实际分配得到的内存大小是多少呢?答案是都是16个字节大小。
二、结构体内部 内存布局的观察 我们在一个代码案例中看到编译器输出的结构是8 / 12;但是我们知道char类型的内存大小位一个字节,int类型的内存大小位4个字节;为什么S1的内存大小是8个字节而不是...这里就解释了,为什么S1的内存大小是8个字节而不是6个字节,因为结构体的内存分配中存在未被使用的地址空间。 三、内存对齐方式 我们虽然通过测试,明白了案例一的内存空间分配情况。...c2要对齐,本身大小为1,对齐数为8;所以对齐到1的整数倍的地址,即为地址1; i也要对齐,本身大小为4,对齐数为8;所以对齐到4的整数倍的地址,即为地址4; s2结构体: c1是第一个成员,在与结构体变量偏移量为...i本身大小为4,对齐数为8;所以对齐到4的整数倍的地址,即为地址4; c2本身大小为1,对齐数为8;所以对齐到1的整数倍的地址,,但是0~7的地址空间被占用,所以c2起始地址为8; 那么我们再来看一个结构体...既满足内存对齐,又节省空间 *五、修改默认对齐数 我们在对齐规则中,我们知道visual studio的默认对齐数是8,但是gcc编译器(Linux)无默认对齐数。
VS 中默认的值为 8 Linux中gcc没有默认对⻬数,对⻬数就是成员⾃⾝的⼤⼩ 3.结构体总⼤⼩为最⼤对⻬数(结构体中每个成员变量都有⼀个对⻬数,所有对⻬数中最⼤的)的整数倍。...最终计算字节总大小的时候用所有成员中最大对齐数(包括被嵌套结构体中的成员)进行整数倍的计算。 下图即为上述代码的演示图例: 为什么存在内存对⻬? 1....合理地处理结构体的内存对齐可以增强程序在不同平台上的移植性,使程序更容易地在不同平台上移植和运行 针对于性能优化,我们可以了解到结构体对齐是为了优化性能,用空间换时间,那么有没有什么办法让我们尽量的减少浪费的空间呢...重点在于,在已经规定的位段情况下,后面的a,b,c,d赋值后在内存中是如何存储的呢? 图示操作如下: 最后的d由于在第二个字节段中无法存储,所以会直接存到下一个字节中,大小位4比特。...在一些嵌入式系统或需要高效利用内存的场景中,位段结构体可以发挥重要作用。 更好的可移植性:位段结构体可以帮助开发者更好地处理不同机器上的字节顺序问题和对齐方式。
1.2 为什么学习数组? 在了解了什么是数组的情况下,我们又会产生一个疑问,为什么要引入数组这个概念呢?我们学习数组的目的是什么呢? 我们拿一个例子来说明: 存放一串整数,我们用代码可以怎么表示?...但是呢,并不是所有情况下都可以使用变量,比如 补充知识点: 在C99标准之前,数组的大小必须是常量或者常量表达式; 在C99之后,数组的大小可以是变量,这是为了支持变长数组; 变长数组的意思是 数组的大小是通过变量来指定的...Keil:在 Keil 编译器中,可通过相关设置使其支持 C99(变量声明在执行语句之后)。具体操作是在“Options for Target”中的“C/C++”选项卡下,勾选“C99 Mode”。...sizeof函数是 C 语言和 C++语言中的一个运算符,用于计算数据类型或变量占用的内存字节数。 不知道大家有没有对 %zd\n" 有所疑惑,为什么这里要使用%zd 呢?...但是呢,并不是有了这个就能绝对保证并不会越界,在写代码的过程中呢,我们还是要自己多注意。
每本书的位置都是固定的,而且它们都属于同一类型(比如都是小说或者都是传记)。 在了解了什么是数组的情况下,我们又产生一个疑问,为什么要引入数组这个概念呢?...但是呢,并不是所有情况下都可以使用变量,比如 补充知识点: 在C99标准之前,数组的大小必须是常量或者常量表达式; 在C99之后,数组的大小可以是变量,这是为了支持变长数组; 变长数组的意思是 数组的大小是通过变量来指定的...Keil:在 Keil 编译器中,可通过相关设置使其支持 C99(变量声明在执行语句之后)。具体操作是在“Options for Target”中的“C/C++”选项卡下,勾选“C99 Mode”。...比如说,有一个整数类型的一维数组 int arr[5] = {1, 2, 3, 4, 5} 。 注:地址是16进制的 在 C 语言中,一个整数通常占用 4 个字节的内存空间。...假设这段连续存储空间的起始地址为 0*1000 ,由于在 C 语言中,一个整数通常占用 4 个字节的存储空间。
什么是字节对齐 计算机中内存大小的基本单位是字节(byte),理论上来讲,可以从任意地址访问某种基本数据类型,但是实际上,计算机并非逐字节大小读写内存,而是以2,4,或8的 倍数的字节块来读写内存,如此一来就会对基本数据类型的合法地址作出一些限制...a; char b; int c; short d; }; int main(int argc,char *argv) { /*在32位和64位的机器上,size_t的大小不同...),可以看到,结构体test 的大小为16字节,而不是11字节(a占4字节,b占1字节,c占4字节,d占2字节) #64位机器上编译32位程序可能需要安装一个库 #sudo apt-get install...sizeof(int)大小整除),因此在b后面填充了3个字节,使得c的偏移为8。...在b后面填充后,d已经满足对齐要求了,为什么最后还要填充字节呢?或者说,为什么需要满足第三条准则呢?
为什么编译器不显示47个bit,而是64个bit,是不是跟结构体一样存在内存对齐呢?通过内存对齐来此应对内存的节约呢?...编译器说:再给你在内存空间里弄一个字节(8bit)吧,d要4bit,最后用了4bit,都存完了,总共3个字节。你可能说:有没有巧合呢?不充分吧!...位段中最⼤位的数⽬不能确定。(16位机器最⼤16,32位机器最⼤32,写成27,在16位机器会出问题。 位段中的成员在内存中从左向右分配,还是从右向左分配标准尚未定义。...网络协议中ip数据报的格式: IP数据报报头中的许多字段,其值的范围很小,只需要使用少量比特位就可以表示,这就适合使用位段表示。 比如说4位版本号版本号是不是给4bit就可以了?...简单地说一下,假设呢,你要聊天,说a要发一个信息给b。 假设我们的使用微信,你在微信上发了一个元旦快来啦,之后,你就一下子就发到b手机上去了吗,你只要把它扔到网络上,就发到b的手机去了,不是的。
,,) 在计算机中,计算机的cpu处理数据就是从内存里面读取的,那么相应的,生活中每个门牌号可以叫做地址,计算机中,内存单元是字节,字节在内存中的位置,即内存单元编号,就像是生活中的门牌号,我们知道了就可以进行访问...简单理解就是32位机器有32根线,线的状态只有0或者1,那么总共表示的含义就是2^32种,每种对应一个地址,64位机器同理,那么问题来了,地址也是会有大小的,不同的环境下指针的大小也是不一样的。...看看咯 你看,x64和x86的环境下,指针变量的大小是不是如刚才所说,一个是8一个是4。 注意指针变量的大小和类型是无关的,只要指针类型的变量,在相同的平台下,大小都是相同的。...3 1)不同指针的解引用 既然同一平台下,指针变量的大小是一样的,那么为什么还有不同的指针类型呢? 先看两段代码,在内存中调试看一下呢?...release版本不建议使用。assert常被称为“断言”,断言嘛,断言哪个是对的咯。 8 指针是访问地址的,但是不仅仅可以访问地址,还可以通过地址做出你意想不到的事。
而在32位系统当中可能存在一定的差异,可以参考下表: 除了这些以外,还有指针需要特别注意。在32位系统当中,指针的大小是4个字节,而在64位系统当中,则是8个字节。...当内存超过4GB时,4个字节的指针就无法表示所有地址了,因此要采用更长的8个字节的指针。 另外,变量类型占据的空间也和编译器版本有关,我们可以使用sizeof函数查看变量类型占用的字节数。...我们知道int占据4个字节,而char占据1个字节。按理说,整个结构体应该占据5个字节。 但是当我们使用sizeof函数打印出它的大小时,会发现结果是8而非5。...int main() { printf("%d\n",sizeof(Test)); // 输出8不是5 return 0; } 这是因为char占用了一个字节之后,在填入int时它会跳过三个字节...内存对齐时会遵循两个规则: 结构体的第一个成员的偏移量为0,以后每个成员的偏移量都是它本身长度与有效对齐值中较小那个的整数倍。 结构体的总大小是有效对齐值的整数倍。
C++被称为“C with class”,可见在C++中class是多么重要,与class类似的一个结构就是struct了,struct最早是在C语言中出现的,在C++中对struct的功能也进行了扩展...为什么不一样呢? struct为空的结构体 表示占位为0字节,那么class为空的类的sizeof的意义呢: 一个类的实例化对象所占空间的大小?注意不要说类的大小,是类的对象的大小....为什么是大于等于而不是正好相等呢?...如果在类中声明了虚函数(不管是1个还是多个),那么在实例化对象时,编译器会自动在对象里安插一个指针指向虚函数表VTable,在32位机器上,一个对象会增加4个字节来存储此指针,它是实现面向对象中多态的关键...cout8 //对象c实际上只有6字节有用数据,但是按照上面第二点编译器优化,编译器将此扩展为两个字,即8字节 cout<<sizeof(d)
这样做的优点是实现简单,而缺点呢,因为每次都在堆上进行分配,而堆上内存的分配效率非常差(当然是相对栈来说的),所以有没有更好的实现方式呢?下面我们看先STL中的基本实现。...那么string有没有类似Redis整数集合的功能,进行类型升级呢?...PS:需要注意的是,此优化自GCC5.1生效,也就是说对于GCC版本小于5的,无论长度为多少,都从堆上进行分配。...(PS:GCC4.9.4版本的输出,分配字节数大于实际的字节数,这个是string的又一个优化策略,即预分配策略,在后面的内容中将会讲到)。...结语 本文中的测试环境基于Centos6.8 & GCC5.4,也就是说在本环境中,string中如果实际数据小于16个字节,则在本地局部存储,而大于15字节,则存储在堆上,这也就是string的一个优化特性
(6) 在申请内存时,malloc(0)其实也是成功的,因为系统规定少于一定数目的大小,都申请规定的大小,如在win32系统下申请少于 32 字节的地址,最后申请到的空间是 32 字节,在朱老师视频中申请少于...8字节对齐(8的整数倍) (3)猜测4字节/8字节其实是针对int型/double型的,比如0地址是char型,那么4字节对齐,int型、float型就必须从4地址开始存放,那么8字节对齐,int型就必须从...,4字节对齐(4的整数倍),就必须是0、4地址, 8字节对齐(8的整数倍),就必须是0、8、16 char c; int a; //short d; }s1; struct stu2 { char...中才支持的,所以很多延续c89的编译器是不支持restrict关键字,gcc支持的。...8.9、C语言中的NULL NULL在C/C++中的标准定义 (1)NULL不是C语言关键字,本质上是一个宏定义,其保护指针的作用,不要让他乱开枪。
0; } 运行: 图解分析: 首先看union Un1如果联合体的大小是最大成员的最大成员的的大小,在联合体union Un1中,char[5]的大小理应是5,那计算的结果不是5。...为什么是8呢?这是因为它完成了对齐的操作,如果是数组,是按元素类型大小来算他的对齐数的。...此时最大成员大小是数组char [5]大小为5,5不是4的整数倍,8(4*2)是4的整数倍。是不是真的是这样呢?会不会是偶然呢?...在C语⾔中是可以的,但是在C++是不⾏的,C++的类型检查⽐较严格。 在C语言中,枚举类型实际上就是整数类型,编译器会把枚举常量替换成对应的整数值。所以可以用整数直接给枚举变量赋值。...GREEN = 2, BLUE = 4 }; Color c; c = 1; // 错误,类型不匹配 输出: 总结: C语言中枚举类型实际上就是整数,允许用整数直接赋值 C++中枚举类型是独立类型
领取专属 10元无门槛券
手把手带您无忧上云