在 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
或类似名称)或堆栈中结束,具体取决于范围。即使未使用该变量,它也可能会被分配,具体取决于编译器优化器设置。
代码和只读数据段都将存储在微控制器的闪存中。
案例 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
或类似名称)或堆栈中结束,具体取决于范围。即使未使用该变量,它也可能会被分配,具体取决于编译器优化器设置。
代码和只读数据段都将存储在微控制器的闪存中。