案例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,其他地方?
这是否意味着预处理器定义是一种减少内存使用的方法?
答案 0 :(得分:4)
预处理器定义由预处理器解析。这意味着预处理器将用定义的值(即12)替换源代码中定义的名称(即x
)的每个出现。
预处理器在编译器之前运行(因此名称为预处理器)。在编译时和运行时没有更多的x,编译只会在你写x的地方看到12。
答案 1 :(得分:1)
所有号码必须存放在某个地方 - 您无法在空中分配号码。无论使用哪种方法,使用的内存量都是相同的。但是,您可能会被内存段名称或优化程序设置误以为存在差异。
如果您使用预处理器,如果程序使用预处理器(段名称.text
或代码中的CODE),它们将嵌入到机器代码中。只需在程序中不使用#define x 12
键入x
,就意味着该值不会存储在任何地方,因为它未被使用。
如果声明它,const
将以只读数据段(.rodata
或类似名称)或堆栈结束,具体取决于范围。即使未使用该变量,它也可能会被分配,具体取决于编译器优化器设置。
代码和只读数据段都将存储在微控制器的闪存中。