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

Different Memory-need in case of using "const" and "#define" in 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

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

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

所有数字都必须存储在某个地方 - 您不能凭空分配数字。无论您使用哪种方法,使用的内存量都是相同的。但是,您可能会误以为内存段名称或优化器设置存在差异。

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

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

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