精华内容
下载资源
问答
  • 指针变量占用内存空间大小根据所使用的操作系统及编译环境而定,指针类型占用的字节数是不同的。一般而言:16位机器的代码时,指针占2个字节32位机器的代码时,指针占4个字节64位机器的代码时,指针占8个字节对于...

    指针变量占用的内存空间大小根据所使用的操作系统及编译环境而定,指针类型占用的字节数是不同的。

    一般而言:

    16位机器的代码时,指针占2个字节

    32位机器的代码时,指针占4个字节

    64位机器的代码时,指针占8个字节

    对于一个具体的测试环境,可以用下面的语句精确的知道指针类型占用的字节数:

    printf( " %d\n " ,  sizeof(int *) ) ;

    测试环境:Ubuntu 64位

    查看系统的版本为Ubuntu18.04 64位

    0859c5a323aed9b410382f5453e72516.png

    struct TRef

    {

    char* before;

    char* after;

    };

    int main()

    {

    struct TRef r ;

    printf("sizeof(int) = %d\n", sizeof(int));

    printf("sizeof(r) = %d\n", sizeof( r ) );

    printf("sizeof(r.before) = %d\n", sizeof(r.before));

    printf("sizeof(r.after) = %d\n", sizeof(r.after));

    printf("&r.before = %p\n", &r.before);

    printf("&r.after = %p\n", &r.after);

    return 0;

    }

    运行结果:

    79decf0d9d12dcf8dcbd8f332466fea6.png

    可见指针变量在64位机器中是占用8个字节的内存空间大小的

    同样的程序运行于32位机器时,测试环境windows下Qt creater32位环境下:

    f389aa649224be9d4b3a27e98685dd1e.png

    e5fcc076f84be825a9e9d575acd5870f.png

    在网上看到还有这种言论,真是误人子弟

    d952eaa106c5e10cd3def3e742812c0e.png

    展开全文
  • 我们学习C++时经常会用到,某一个类型的变量在内存中所占的内存大小,有时候会忘记,记录下备用 表 类型 位 范围 char 1 个字节 -128 到 127 或者 0 到 255 unsigned char 1 个字节 0 到 255 signed char...
    文章目录[隐藏]

    前言

    在我们学习C++时经常会用到,某一个类型的变量在内存中所占的内存大小,有时候会忘记,记录下备用
    

    类型范围
    char1 个字节-128 到 127 或者 0 到 255
    unsigned char1 个字节0 到 255
    signed char1 个字节-128 到 127
    int4 个字节-2147483648 到 2147483647
    unsigned int4 个字节0 到 4294967295
    signed int4 个字节-2147483648 到 2147483647
    short int2 个字节-32768 到 32767
    unsigned short int2 个字节0 到 65,535
    signed short int2 个字节-32768 到 32767
    long int8 个字节-9,223,372,036,854,775,808 到 9,223,372,036,854,775,807
    signed long int8 个字节-9,223,372,036,854,775,808 到 9,223,372,036,854,775,807
    unsigned long int8 个字节0 到 18,446,744,073,709,551,615
    float4 个字节精度型占 4 个字节(32 位)内存空间,+/- 3.4e +/- 38 (~7 个数字)
    double8 个字节双精度型占 8 个字节(64 位)内存空间,+/- 1.7e +/- 308 (~15 个数字)
    long double16 个字节长双精度型 16 个字节(128 位)内存空间,可提供 18-19 位有效数字。
    wchar_t2 或 4 个字节1 个宽字符
    注意:不同系统会有所差异。
    
    展开全文
  • 引用实际上是占用内存空间的,但程序把它按照不占用内存空间来处理。

    变量的引用:int &b = a;

    根据引用的定义,b作a的别名,不单独占用内存空间。如果取b和a的地址,会发现它们是相同的。

    但程序怎么知道b是指向a的呢?如果b是个指针,程序将开辟一块内存空间,存储“b指向a”这一信息;如果没有一块内存空间来存储“b指向a”这一事实,程序读到b时应该不知所措,怎么能顺利知道b是a的别名呢?

    实际上,b在内存条上是占用了一块空间的。不过编译器对它进行了一些处理,使得程序认为它不单独占用内存空间,且取其地址时直接取到所指向的地址。实际在内存空间上,引用本身也占用一块内存,里面存储着所引用的变量的地址,大小与指针相同,字面上也表现为unsigned long int型。只是经过编译器处理后,访问这块内存时将直接转而访问其指向的内存。因此在程序中无法读取到这块内存本身。

    这可以理解为“编译器的把戏”或“程序的谎言”,但这一机制不是为了捉弄程序员,而是为了真正实现别名的效果。

    综上:引用的实现实际上是占用内存空间的,但程序把它按照不占用内存空间来处理。

    在不同编译器中,引用的实现方式可能会有不同。C++语言本身对此实现机制并无说明。因此上述实现机制可能仅适用于部分编译器。

    补充:引用的“不占用内存"和宏定义的”不占用内存“不是一回事。二者都可以理解为”别名“,但引用是在程序运行过程中声明的,属于程序运行的层面;而宏定义是代码编译层面的,类似于对代码文本进行”全文替换“,不涉及程序运行,是真正的不占用内存。

    展开全文
  • =========================================================================================我看来,学习java最重要是要理解what(这东西是什么),why(为什么要用它),where(哪用它),how(怎么用)。...

    =========================================================================================

    在我看来,学习java最重要是要理解what(这东西是什么),why(为什么要用它),where(在哪用它),how(怎么用)。所以接下来,我都是以这样的思想来和大家交流,从最基础的知识讲起。如果有啥出错的,欢迎大家前来批评。本人虚心接纳。

    =========================================================================================

    一.前言

    对于变量,我们再熟悉不过了,谁都知道声明一个变量,赋值。其实一直以来,变量也并不简单,我们很少系统地整理分类,更少研究变量对应的储存结构,这次就深入地了解一下变量,以及常量。

    二.What(什么是变量,先从变量说起)

    1.变量的简单定义:通俗来说,变量就是可以被改变的数据。在程序中声明变量的语法格式如下: 数据类型 变量名称= 值  例如:int x= 1,数据类型定义这个变量是什么类型的(有整型,浮点型等),变量名称只是个别名,值就是对应的数据。

    2.变量的深入定义:由上面可知,变量就是一个可改变的数据,既然是数据,在计算机中肯定有对应的存储空间来存储这个数据。也就是说,变量其实就是内存中的一个存储空间,用来存储数据。那这么说,声明一个变量,也就是相当于变量空间的开辟,那么,变量的深入定义还对应上面简单定义哪些呢?

    (1).声明一个变量=变量空间的开辟

    (2).变量的数据类型=这个空间要存储什么数据?

    (3).变量名称=这个空间叫什么名字?

    (4).变量的值=这个空间的第一次数据是什么?

    那么, 这些变量空间究竟在哪里呢?其实这些变量空间对应计算机内存的堆栈,下面会详细讲解。

    3.变量的分类

    (1).按声明的位置来分类:

    a.成员变量:声明在方法之外的变量,不过没有 static 修饰。可以不设值,因为有默认值(下面数据类型会有默认值)。

    b.局部变量:声明在类的方法中的变量。必须对其初始化,否则编译不过。

    c.类变量:声明在方法之外的变量,用 static 修饰。

    (2).按数据类型划分(也就是定义数据是什么类型)

    a.基本数据类型:

    byte:在内存中占8位(bit),即1个字节,取值范围-128~127,默认值0

    short:短整型,在内存中占16位,即2个字节,取值范围-32768~32717,默认值0

    int:整型,用于存储整数,在内在中占32位,即4个字节,取值范围-2147483648~2147483647,默认值0

    long:长整型,在内存中占64位,即8个字节-2^63~2^63-1,默认值0L

    float:浮点型,在内存中占32位,即4个字节,用于存储带小数点的数字(与double的区别在于float类型有效小数点只有6~7位),默认值0

    double:双精度浮点型,用于存储带有小数点的数字,在内存中占64位,即8个字节,默认值0

    char:字符型,用于存储单个字符,占16位,即2个字节,取值范围0~65535,默认值为空

    boolean:布尔类型,占1个字节,用于判断真或假(仅有两个值,即true、false),默认值false

    注意:整型、实型(常量)、字符型数据可以混合运算。运算中,不同类型的数据先转化为同一类型,然后进行运算。

    转换从低级到高级:byte,short,char—>int—>long—>float—>double

    (1).强制类型转换: 转换过程中可能导致溢出或损失精度

    c40b1ccf7fc700a4466a488ac545b776.png

    7f98f382bc8960a1bcfaffc863e67f51.png

    (2).自动类型转换:必须满足转换前的数据类型的位数要低于转换后的数据类型,例如: short数据类型的位数为16位,就可以自动转换位数为32的int类型,同样float   数据类型的位数为32,可以自动转换为64位的double类型。

    (3).float和double区别:默认的浮点数都是double 只有在数组后边加上f才是 float的,float f=12.2f;这是定义一个float类型的数据

    b.引用数据类型: 除了8中基本类型以外剩下的都是引用类型(类,接口,数组等,后面详细介绍,new的是引用类型)

    String:一定要注意,string是引用类型,不是基本类型。

    那么,就有人问了,基本类型和引用类型有啥区别,啥是引用类型,这就有很大学问了,顺便也扯上了变量内存结构了。

    (3).详细讲解基本类型和引用类型的区别以及两者在内存的存储位置

    a.上面说过了变量声明就是一个内存空间的开辟,那这些内存空间在哪呢?

    首先了解一下java内存结构:JVM分了5片内存:

    1.程序计数器:记录程序执行到哪一个指令

    2.本地方法栈:与虚拟机栈功能相似,不过虚拟机栈为java方法服务,本地方法栈为Native方法服务

    3.方法区:存放字节码,常量 ,静态变量,是一个共享的区域

    4.虚拟机栈:执行方法其实就是栈帧入栈,出栈的过程,因为是跟方法有关的,而且局部变量常常在方法中,所以栈存储的是局部变量

    0170d555108ad99c27972c2b689cdfc6.png

    5.堆:存放引用类型,成员变量

    注意:(1).我们接触最多的是堆和栈(虚拟机栈),这里一定要注意这两个的区别。

    (2).栈主要是存储方法帧的,每执行一个方法的时候,就会为该方法创建一个栈帧,使其入栈。然而局部变量一般随着方法生成而存在,所以局部变量存储在栈中。

    (3).堆一般用来存放引用型对象,以及对应的成员变量,当对象创建时,会在堆中开辟一块地址,并给这个对象的成员变量使用。

    b.基本类型没什么好说的,就是一个空间存储数.但注意:很多网上教程会说,基本类型是存在栈中,这是错误的,因为基本类型也分成员变量和局部变量,局部变量随着方法入栈就存在栈中,而成员变量会随着对象在堆中空间的开辟而存储在堆中。例如: int[] a=new int[]{1,2}; 由于new了一个对象,所以new int[]{1,2}这个对象时存储在堆中的,也就是说1,2这两个基本数据类型是存储在堆中。

    c.引用类型就比较特别,引用类型占用两块内存,一个栈,一个堆, 栈中存放的是堆中的地址。啥意思?什么是引用类型?举个简单例子,一间房子,我可以在里面 放置家具,放完后用钥匙锁着,把钥匙放在抽屉里面,那我想找某个家具是不是通过钥匙来找到房间再进去找家具。从这个例子我们可以对应一下,房间就是内存堆开辟的空间,家具就是数 据,钥匙就相当于引用类型(堆中的地址),抽屉相当于栈,具体的数据放在堆上,引用类型放在栈上。例如:String s=new String("hello world"),new出来的hello world是存放在堆中,并且将这个堆地址给栈中s来保存。

    b5970405e3a286e97ed27fe428d2b94b.png

    (4).变量的作用域:

    a.从定义上说,变量作用域到大括号结束,出了大括号就就不存在了

    b.从内存上解释,一个类中什么时候有大括号的存在?只有两种情况,一个是类两端有大括号,例如:public class Person{},还有是类里面的方法有大括号,例如:public void a(){}。先说类里面的方法,上面也说了,执行完这个函数就相当于出栈,那么局部变量也当然随着函数的结束而销毁,大括号等同于这个类或方法已经执行完了,也就是说作用域只在大括号内,出了大括号就意味着函数结束了,也就是出栈了,变量作用域就无效了。同理,类两端里面是全局变量,执行到大括号也就是类被释放了,对应的全局变量也没了。

    (5).举个例子说明一下

    d9a687aa8c6870a8ed21b5d9680fd134.png

    77d664f0f34027a64da2010761eb25ba.png

    上面方法执行流程为:

    1.main方法的栈帧入栈,在main的帧当中有一个a= 20;

    2.当执行show(a)时,此时传入了一个参数a= 20;执行show方法,show方法的栈帧入栈,第一次打印结果为a= 20,a改为50,再次打印 结果为:a = 50;

    3.当执行完show方法后,show方法的栈帧就会出栈;

    4.此时栈中只有一个main方法的栈帧,所以在执行完show方法后,再去打印a ,此时a = 20;

    三.总结

    1.这篇文章更多是强调变量对应的内存关系,详细了解堆栈,一定要明确好关系。

    2.引用型基本上都是new出来的,string特别点,引用型new出来的内容放在堆上,地址存放在栈上。

    3.基本类型也分成员变量和局部变量,局部变量随着方法入栈就存在栈中,而成员变量会随着对象在堆中空间的开辟而存储在堆中。

    4.局部变量是存储在栈中,成员变量是存放在堆中(因为随着类的创建生成,类创建是在堆上)。

    ===========================================================================

    用心查阅,有心分享,分享之际,互相指教,受益你我,何乐不为?

    ===========================================================================

    展开全文
  • 本文主要结合luceneRamUsageEstimator类来谈谈Java对象在内存中占用空间大小。注意这种计算方式适用于OpenJDK和Oracle JDK两个版本,其它版本可能有所不同。从整体来看,java对象由对象头、实例数据、对齐填充3...
  • 字符占字节分为()宿舍、型变办公楼、旅馆等小开间建筑选用混合结构时,宜采用()方案墙体承重方式内存纵墙承重的优点是()语言墙体根据构造和施工方式不同,可以分为()普通普通砖墙可分为()孔洞率不小于15%...
  • 向含有AgCl(s)的饱和AgCl溶液加水,占用下列叙述正确的是( )水准测量,使用设后尺A的读数a=2.713 m,前尺B的读数为b=1.40m,已知A点高程为15.000m,刚视线高程为( )m。对偶句的优点是“_______”,内存在...
  • 全局变量保存在内存的全局存储区占用静态的存储单元;局部变量保存,只有所在函数被调用时才动态地为变量分配存储单元。该题目考查的知识点是变量的存储类型及性质。C语言经过编译之后将内存分为以下几...
  • Java程序计算各种对象所占内存的大小的方法。基类:public abstract class SizeOf {private final Runtime s_runtime = Runtime.getRuntime();/**** 子类负责覆盖该方法以提供被测试类的实例** @return 被测试类的...
  • 请教各位牛人,python有没有计算某个对象占用内1 2 s = 'abc' print sys.getsizeof(s) 如果你要监测所有的变量,可以用python的smiley 模块监测所有的内存变量情况人生就是一次感恩之旅,开心是一种觉悟的境界,...
  • matlab怎么为变量分配内存(怎么计算变量占用内存)(2014-04-04 16:22:22)1、创建和修改数组——基本思想是保持内存的连续性(1)当为数组赋值时,Matlab在内存中分配连续的虚拟块,另一个地方,将数组的类型和维数...
  • 局部变量(Local Variable):定义函数体内部的变量,作用域仅限于函数体内部。离开函数体就会无效。再调用就是出错。 全局变量(Global Variable):定义:所有的函数外部定义的变量,它的作用域是整个程序,也...
  • 如全局变量或静态变量(包括一些复杂类型的常量),它们所需要的空间大 小可以明确计算出来,并且不会再改变,因此它们可以直接存放可执行文件的特定的节里(而且包含初始化的值),程序运行时也是直接将这个节加载到...
  • 编辑:编辑答案之前,我使用了一个具有意外行为的未记录的函数,并且它的签名在不同版本的MATLAB之间不稳定所以这里我提供了@CrisLuengo答案的扩展版本.我们可以使用哈希映射递归函数check_shared存储数据元素...
  • php中变量内存

    2021-04-12 14:07:01
    php存储数据的一种方式,就是i可以发生改变的量,这种方式是在内存中开辟一个可以存放数据的空间,给这个空间起个名称,这时候的空间就可以称为一个变量运行过程这个值是可以发生改变的当前空间的名称就是...
  • 前面对于Java的String类占用多大的内存空间这个问题,是最近面试问的比较多的一个问题。很多小伙伴的回答的都不是很正确,有说不占空间的,有说1个字节的,有说2个字节的,有说3个字节的,有说不知道的,更...
  • 对于一个C语言程序而言,内存空间主要由五...布局如下在上图,由编译器分配的地址空间都是连接的时候分配的,而运行时分配的空间程序运行时由系统分配的BSS段:BSS段(bss segment)通常是指用来存放程序未...
  • 基本数据的类型的大小是固定的,这里就不多说了。对于非基本类型的Java对象,其大小就值得商榷。...这样程序完成了一个Java对象的生命,但是它所占的空间为:4byte+8byte。4byte是上面部分所说的Java栈...
  • 局部变量一:全局变量全局变量保存在内存的全局存储区占用静态的存储单元二:局部变量局部变量保存,只有所在函数被调用时才动态地为变量分配存储单元三:C语言经过编译之后将内存分为以下几个区域(1).....
  • int型命令会在内存中开辟一个32比特的内存空间 通过以下代码 #include <stdio.h> int main() { int a; printf("%ld",sizeof(int)); return 0; } 运行后可以知道int在内存中占据四个字节,因为1字节=8 bit;...
  • 代码如下(示例): apply(as.data.frame(ls()),1,function(str){cat(str,":",eval(parse(text=paste0("object.size(",str,")"))),'\n')})
  • 引用变量是基本数据类型,存放的是引用指向实际对象的内存地址,实际对象存放。这也解释了为什么说Java方法的参数传递只有值传递了,因为传递的只是把指向对象的内存地址赋值给了方法参数的局部引用变量,与...
  • 动态存储区分为 栈区、堆区 也统称为堆栈段1.1栈区(stack) 编译器自动分配释放,存放函数的参数值,局部变量的值等。函数结束自动释放1.2堆区(heap)一般由程序员分配释放, 若程序员不释放,程序结束时可能由os回收 ...
  • 变量、地址变量的实现方式有:引用语义、值语义python语言中变量的实现方式就是引用语义,在变量里面保存的是值(对象)的引用(值所在处内存空间的地址)。采用这种方式,变量所需的存储空间大小一致,因为其中只需要...
  • In Java, does it cost memory to declare a class level instance variable without initializing it?For example: Does int i; use any memory if I don't initialize it with i = 5;?Details:I have a huge super...
  • Java变量以及内存分配

    2021-02-26 15:47:17
    堆栈静态存储区域一个由C/C++编译的程序占用内存分为以下几个部分1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构的栈。2、堆区(heap)— 由程序员分配...
  • rt我自己定义了一个class,声明了变量As (第一行就是)用whos语句查的时候,貌似只返回了 As...)因为As肯定远远大于112Bytes的,差不多1GB的样子怎么看它具体占用内存呢?谢谢Name Size BytesClass AttributesAs ...
  • Object o = new Object()在内存中占用多少字节? ================================================ 对象的创建过程: 类加载: a.class loading; b.class linking:verification、preparation、resolution; c....
  • 因为局部变量空间是可以覆盖的(某个函数的局部变量空间在退出该函数是就释放,由别的函数的局部变量覆盖),可以提高内存利用率 。当然静态局部变量除外,其内存使用方式与全局变量相同;3、 确保你的程序没有未调用...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 332,028
精华内容 132,811
关键字:

不同变量在内存中的占用空间