在IAR中使用“const”和“#define”时需要不同的内存

时间:2017-06-22 08:31:12

标签: c memory c-preprocessor iar

案例1:
使用#define将所有常量定义为预处理器定义,如:

  #define  x          12 

内存使用情况(来自file_name.lst

 2 240 bytes of CODE memory
   920 bytes of DATA memory

案例2:
使用const unsigned int将所有常量定义为编译器定义,如:

  const unsigned int x = 12;

内存使用情况(来自file_name.lst

 2 240 bytes of CODE memory
     1 byte  of CONST memory
   920 bytes of DATA memory

我的问题:
预处理器定义保存在哪里? Flash,RAM,其他地方?
这是否意味着预处理器定义是一种减少内存使用的方法?

2 个答案:

答案 0 :(得分:4)

预处理器定义由预处理器解析。这意味着预处理器将用定义的值(即12)替换源代码中定义的名称(即x)的每个出现。 预处理器在编译器之前运行(因此名称为预处理器)。在编译时和运行时没有更多的x,编译只会在你写x的地方看到12。

答案 1 :(得分:1)

所有号码必须存放在某个地方 - 您无法在空中分配号码。无论使用哪种方法,使用的内存量都是相同的。但是,您可能会被内存段名称或优化程序设置误以为存在差异。

如果您使用预处理器,如果程序使用预处理器(段名称.text或代码中的CODE),它们将嵌入到机器代码中。只需在程序中不使用#define x 12键入x,就意味着该值不会存储在任何地方,因为它未被使用。

如果声明它,const将以只读数据段(.rodata或类似名称)或堆栈结束,具体取决于范围。即使未使用该变量,它也可能会被分配,具体取决于编译器优化器设置。

代码和只读数据段都将存储在微控制器的闪存中。