不同数据类型变量在不同CPU或MCU下的内存占用情况还与编译器或编译选项有关

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字节宽度的编译选项.

阅读更多
个人分类: 技术
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭