精华内容
下载资源
问答
  • 初学,见书上例子,如,16位计算机,整型变量占2个字节,而32位计算机,整型变量占4个字节。那么是什么原因导致了他们占用的字节不同,能从原理上解答吗?
  • 请留意两个.dpr文件中的细微不同。  输出结果是类似这样的:  ______________________________________________________  Const 1 Addr : 0040858C Length: 4  Const 1 Data : 0040858C Length: 10  Const...
  • C语言申请变量时顺序不同,会导致占用的内存不能,特别是使用结构体时,结构体内的变量是连续存放,使用不当,将会浪费大量内存空间,下面以代码说说明 1、 #include <stdio.h> #include <string....

    C语言中申请变量时顺序不同,会导致占用的内存不能,特别是在使用结构体时,结构体内的变量是连续存放的,使用不当,将会浪费大量内存空间,下面以代码说说明

    1、

    #include <stdio.h>
    #include <string.h>
    #define u8 unsigned char
    #define u16 unsigned short int
    #define	u32 unsigned int
    typedef struct
    {
    	u16 a;
    	u8  b;
    	u16 c;
    	u32 d;
    	u8  e;
    	u16 f;
    
    		
    }TEST_TpyeDed; 
    
    TEST_TpyeDed test;
    
    int main()
    {
    	printf("a:%d\n",(u32)(&test.a));
    	printf("b:%d\n",(u32)(&test.b));
    	printf("c:%d\n",(u32)(&test.c));
    	printf("d:%d\n",(u32)(&test.d));
    	printf("e:%d\n",(u32)(&test.e));
    	printf("f:%d\n",(u32)(&test.f));
    	printf("test size:%d\n",sizeof(test));
    	printf("TEST_TpyeDed size:%d\n",sizeof(TEST_TpyeDed));
    
    }

    运行结果:

    可以看到,结构体大小为16字节,从输出的地址可以得出,b、e虽然定义为8位,但却都占用了2字节,c虽然定义为16位,但占用了4字节。这是因 为,字节变量地址会以单字节对齐,字变量地址会以双字节对齐,双字变量地址会以4字节对齐

    2、再来看另一个程序

    #include <stdio.h>
    #include <string.h>
    #define u8 unsigned char
    #define u16 unsigned short int
    #define	u32 unsigned int
    typedef struct
    {
    	u8  b;
    	u8  e;
    	u16 a;
    	u16 c;
    	u16 f;
    	u32 d;
    	
    }TEST_TpyeDed; 
    
    TEST_TpyeDed test;
    
    int main()
    {
    	printf("a:%d\n",(u32)(&test.a));
    	printf("b:%d\n",(u32)(&test.b));
    	printf("c:%d\n",(u32)(&test.c));
    	printf("d:%d\n",(u32)(&test.d));
    	printf("e:%d\n",(u32)(&test.e));
    	printf("f:%d\n",(u32)(&test.f));
    	printf("test size:%d\n",sizeof(test));
    	printf("TEST_TpyeDed size:%d\n",sizeof(TEST_TpyeDed));
    
    }

    运行结果

    可以看到,此时结构体的大小12字节,节省了4个字节空间,

     

    所以在申请变量顺序时,尽量让变量连续存放,减少空间浪费

    展开全文
  • C各种常见数据类型变量占用的存储空间依赖于编译器和MCU/CPU架构:现对不同的架构上数据类型以实例作说明,下面用临时写函数data_type_test作具体说明.void data_type_test(void){ char chData = 0;...

    C语言现在越来越多的用在了嵌入式中,即使在很多8位MCU(单片机)中也是如此,当然,对于32位的MCU或CPU,就很难想像有人不用C语言作开发,汇编语言只在初始化C堆栈时使用到,其它情况下很少会使用汇编在32位甚至在64位架构上开发,

    C中各种常见数据类型变量所占用的存储空间依赖于编译器和MCU/CPU架构:现对不同的架构上的数据类型以实例作说明,下面用临时写的函数data_type_test作具体说明.

     

    void data_type_test(void)
    {
        char chData = 0;/*  */
        char *pch = &chData;
        char *pstr = "str";
        short sData = 0;
        short *ps = &sData;
        int   iData = 0;
        int   *pi = &iData;
        long  lData = 0;
        long  *pl = &lData;
       
        int   ch_type_len = 0;
        int   pch_type_len = 0;
        int   pstr_type_len = 0;
        int   s_type_len = 0;
        int   ps_type_len = 0;
        int   i_type_len = 0;
        int   pi_type_len = 0;
        int   l_type_len = 0;
        int   pl_type_len = 0;
       
        ch_type_len = sizeof(chData);
        pch_type_len = sizeof(char *);
        pstr_type_len = sizeof(char *);
        s_type_len = sizeof(sData);
        ps_type_len = sizeof(ps);
        i_type_len = sizeof(iData);
        pi_type_len = sizeof(pi);
        l_type_len = sizeof(lData);
        pl_type_len = sizeof(pl);
    }

     

     

    函数 data_type_test 中列举了C语言中最常用的四种整形数据类型 char short int long变量所占用的内存空间大小(以字节为单位)情况,

    该函数在不同的MCU/CPU下计算出的大小一般是不同的.

    在8位的MCU下,因为MCU的内存通常不直接叫内存,而是叫SRAM,一般都比较小,多的可能超过256字节,少的即小于256字节,这样不同的MCU并结合支持该MCU的编译器,对几种整形变量所分配的空间是不一样的.

     

    1.  在MCU PIC16F877 + HI-TECH PICC编译器中,各变量值如下:

         Address      Symbol Name      Value  

         020     pch                   0x3825
         021     pi                    0x3C38
         022     pl                    0x3A3C
         023     ps                    0x083A
         024     pstr                  0x0008
         025     chData                  0x00
         026     ch_type_len           0x0001
         028     i_type_len            0x0002
         02A     l_type_len            0x0004
         02C     pch_type_len          0x0001
         02E     pi_type_len           0x0001
         030     pl_type_len           0x0001
         032     ps_type_len           0x0001
         034     pstr_type_len         0x0001
         036     s_type_len            0x0002
         038     iData                 0x0000
         03A     sData                 0x0000
         03C     lData             0x00000000

     

    2.  在MCU PIC18F84520 + HI-TECH PICC18编译器中,各变量值如下:

       Address      Symbol Name      Value  

         40D     iData                 0x0000
         40F     pi                    0x040D
         411     lData             0x00000000
         415     pl                    0x0411
         417     ch_type_len           0x0001
         419     pch_type_len          0x0002
         41B     pstr_type_len         0x0002
         41D     s_type_len            0x0002
         41F     ps_type_len           0x0002
         421     i_type_len            0x0002
         423     pi_type_len           0x0002
         425     l_type_len            0x0004
         427     pl_type_len           0x0002

     

    3. 在32位CPU或MCU下:

     

    iData         = 0
    pi            = 4
    lData         = 4
    pl            = 4
    ch_type_len   = 1
    pch_type_len  = 4
    pstr_type_len = 4
    s_type_len    = 2
    ps_type_len   = 4
    i_type_len    = 4
    pi_type_len   = 4
    l_type_len    = 4
    pl_type_len   = 4

     

     

    由此可见, 在不同的MCU/CPU中, 常见数据类型 char short int long 中,它们所占用的存储空间是不同的.

    所以在没有前提(MCU/CUP+编译器)下,问sizeof(char *)  或 sizeof(int) 是多少时, 它们是不确定的问题,必须在

    相应的MCU/CPU及所支持的编译器下,才是确定的结果. 而且有些编译器还有支持指定int型为2字宽度或4字节宽度的编译选项.

    展开全文
  • 变量内存分析

    2017-10-17 20:29:12
    为了更好地理解变量在内存中的存储细节,先来认识一下内存中的“字节”和“地址”。 内存以“字节为单位” 2.变量的存储 一个变量所占用的存储空间,不仅跟变量类型有关,而且还跟编译器环境有关系...

    变量内存分析

    本小节知识点

    1.字节和地址

    • 为了更好地理解变量在内存中的存储细节,先来认识一下内存中的“字节”和“地址”。

    • 内存以“字节为单位”


    2.变量的存储

    • 一个变量所占用的存储空间,不仅跟变量类型有关,而且还跟编译器环境有关系。同一种类型的变量,在不同编译器环境下所占用的存储空间又是不一样的

      • 所占用字节数跟类型有关,也跟编译器环境有关

      • 内存由大到小寻址

      • 变量存储单元的第一个字节的地址就是该变量的地址

      • 任何变量在内存中都是以二进制的形式存储。一个负数的二进制形式,其实就是对它的正数的二进制形式进行取反后再+1。(取反的意思就是0变1、1变0)

    类型 16位编译器 32位编译器 64位编译器
    char 1 1 1
    int 2 4 4
    float 4 4 4
    double 8 8 8
    short 2 2 2
    long 4 4 8
    long long 8 8 8
    void* 2 4 8

    3.取值范围

    • 不同数据类型所占的存储空间是不一样的,字节长度不一样,包含的二进制位数就不一样,能表示的数据范围也就不一样

    • 如果赋值的时候超出了变量的取值范围,那么将损失精度,得到“垃圾数据”(“垃圾数据”就是指并非我们想要的数据)

    关键字 所占字节数 表示范围
    int 4 -2(31) ~ 2(31)-1
    signed short int 2 -2(15) ~ 2(15)-1
    signed long int 4 -2(31) ~ 2(31)-1
    unsigned int 4 0 ~ 2(32)-1
    unsigned short int 2 0 ~ 2(16)-1
    unsigned long int 4 0 ~ 2(32)-1
    float 4 绝对值E-37 ~ E+38
    double 8 绝对值E-307 ~ E+308
    展开全文
  • 内存从逻辑上说大体上是分为4 段,栈空间段、堆空间段、代码段、初始化静态段,...是存储占用相同空间长度并且占用空间数据类型地方,比如说整型1,10,100,1000,10000,100000 等等,在内存里面占用空间是.

    内存从逻辑上说大体上是分为4 段,栈空间段、堆空间段、代码段、初始化静态段,程序里面不同的声明 放在不同的内存段里面。

    数据段(data segment)
    通常是指用来存放程序中已初始化且不为0的全局变量如:静态变量和常量

    代码段(code segment / text segment)
    通常是指用来存放程序执行代码的一块内存区域,比如函数和方法;

    栈空间段
    是存储占用相同空间长度并且占用空间小的数据类型的地方,比如说整型1,10,100,1000,10000,100000 等等,在内存里面占用空间是等长的,都是64 位4 个字节。
    堆内存 数据长度不定长,而且占有空间很大的数据类型的数据。如下图:

    堆内存
     数据长度不定长,而且占有空间很大的数据类型的数据存放位置

    php对象在内存中存在哪里呢?
    对象在PHP 里面和整型、浮点型一样,也是一种数据类,都是存储不同类型数据用的, 在运行的时候都要加载到内存中去用,那么对象在内存里面是怎么体现的呢?这样的数据是放在堆内存里面的。

    各类型在内存存储逻辑图如下:

    栈内存是可以直接存取的,而堆内存是 不可以直接存取的内存。
    对象是放在堆里面的
    但对象名称是放在栈里面的

    $p1 = new Person();
    $p2 = new Person();
    $p3 = new Person();
    

    $p1, $p2,$p3就是我们实例出来的对象名称,一个类可以实例出多个对象,每个对象都是独立的。

    从上图可以看出$p1=new Person();等号右边是真正的对象实例,在堆内存里面的实体, 上图一共有3 次new Person(),所以会在堆里面开辟3 个空间,产生3 个实例对象,每个对象之间都是相互独立的,使用自己的空间,在PHP 里面,只要有一个new 这个关键字出现就会 实例化出来一个对象,在堆里面开辟一块自己的空间。 每个在堆里面的实例对象是存储属性的,比如说,现在堆里面的实例对象里面都存有姓 名、性别和年龄。每个属性又都有一个地址。

    $p1=new Person();等号的右边$p1 是一个引用变量,通过赋值运算符“=”把对象的首地址 赋给“$p1”这个引用变量,所以$p1 是存储对象首地址的变量,$p1 放在栈内存里边,$p1 相当 于一个指针指向堆里面的对象,所以我们可以通过$p1 这个引用变量来操作对象,通常我们也 称对象引用为对象。

     

    展开全文
  • 在内存中,每个变量都有自己存储单元,不同类型的变量占用的存储单元空间大小不一样; 对于多字节变量来说,在内存中是按照"高高低低"规则存放, 即:高字节存放在高地址内存单元中,低字节存放在低地...
  • php对象在内存中的分配

    千次阅读 2018-07-12 17:11:16
    内存从逻辑上说大体上是分为4 段,栈空间段、堆空间段、代码段、初始化静态段,程序里面不同的声明 放在不同的内存段里面。数据段(data segment)...栈空间段是 存储占用相同空间长度并且占用空间数据类型...
  • 单片机运行时,代码是Flash运行,跟电脑/linux嵌入式不同) RO-Data:只读常量大小(const常量,#define宏常量。一般用于不需要更改数据) RW-Data:初始化了的变量大小 ZI-Data:没有初始化的变量 ...
  • 变量其实就是用某个特定含义英文...现在我们理解了,所有具体值都可以通过变量来代替,但是对于不同的“值”,系统内存中占用的空间不同的,所以部分编程语言中,将变量分为不同的种类以节约数据存储空...
  • 顾名思义,类变量可以理解为类变量,类变量在类加载时候就已经给它分配了内存空间不同于实例变量(inta;),实例变量是在该类创建对象时候分配内存的。并且,每创建一个对象,就会为该实例变量分配相应...
  • 变量

    2016-11-27 18:13:33
    变量的存储类型:变量在内存中的内存方式,不同的存储方式,影响变量在内存中的生命周期; 计算机的三大组成: 内存 硬盘 CPU 硬盘和内存的区别: 硬盘存放的是静态数据,而内存存放的是动态数据,但是硬盘...
  • 全局变量和局部变量的区别

    千次阅读 2016-11-05 21:21:08
    不同的存储方式,影响变量在内存中的生存中期。 从变量的作用域来看,局部变量只在本函数范围内有效,此外的函数均不能使用;全局变量的有效范围从定义变量的位置开始到本源程序结束。局部变量是程序执行到本函数式...
  • 1 有符号整数与无符号整数的表数范围不同 无符号(unsigned)都是 0----*** 有符号类型是从 -***。。。。。。+*** ...以2字节 (16)位短整型为例 ...2数据在内存中的存储形式不同 3合法的表数范围不同 5可参与...
  • 结构体中的成员可以是不同的数据类型,成员按照定义时的顺序依次存储连续的内存空间,和数组不一样的是,结构体的大小不是所有成员大小简单的相加,需要考虑到系统存储结构体变量时的地址对齐问题。 2. 如何...
  • 开始今天我们来聊聊,一个Java对象,到底在内存占据多大的空间?对象堆和栈Java在程序运动时,内存空间根据功能不同,可以分成五块,分别是寄存器,本地方法区,方法区,堆,栈。单以堆和栈来说,栈主要存放是...
  • 变量含义:程序过程中变量的值会发生变化,直白来说就是用来存储可变化数据变量的好处:使内存空间的得到重复利用举个例子:1 System.out.println(10);2 System.out.println(10);3 System.out.println(10);这三...
  • 引用1.1 引用的概念引用是一种变量指向数据存储空间的现象内存地址是数据在物理内存中的存储位置引用地址是对象在内存中的描述性地址,该地址与内存地址有区别1.2 引用的特征相同的数据在内存空间中仅占用一个存储...
  • 有效范围决定了变量的生命周期,变量的生命周期是指从声明一个变量并分配内存空间开始,到释放该变量并清除所占用的内存空间结束。进行变量声明位置,决定了变量的有效范围,根据有效范围的不同,可以将变量分为...
  • 1978年贝尔实验室正式发表C语言,受到众多IT从业者热捧,即使41年过去了,C语言仍然牢牢占据最...变量的实质是地址内存是存放数据的空间变量在内存中申请一段空间大小,不同类型数据占用的字节数不一样。...
  • 1、GC在程序中定义了一个变量,就是在内存中开辟了一段相应的空间来存值。由于内存是有限,所以当程序不再需要使用某个变量的时候,就需要销毁该对象并释放其所占用的内存资源,好重新利用这段空间。在C/C++中,...
  • 2.变量是指程序运行过程其值可以发生改变量(1) 变量占用一定数量的内存空间,而常量不需要。(2) 局部变量若没有声明为静态变量,那么其初值是随机。(3) 不同类型的变量可以放在一起参与运算,但要注意运算...
  •  顾名思义,类变量可以理解为类变量,类变量在类加载时候就已经给它分配了内存空间不同于实例变量(int a; ),实例变量是在该类创建对象时候分配内存的。并且,每创建一个对象,就会为该实例变量分配...
  • 这就意味着当你创建一个变量时就会在内存中占用一定的空间。基于变量的数据类型,操作系统会进行内存分配并且决定什么将被储存在保留内存中。因此,通过给变量分配不同的数据类型,你可以在这些变量中存储整数,小数...
  • 理解变量

    2016-11-28 23:30:18
    Int num = 5 变量的三大特点: 变量的数据类型:主要说明...变量的储存类型:变量在内存中的储存方式,不同的储存方式,影响变量在内存中的生存周期。 计算机的三大组成部分:CPU 内存 硬盘  动态数据 静态数据

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 505
精华内容 202
关键字:

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