常量是否比通常使用 #define 更多或更少的内存

Does const use more or less memory than #define typically?

本文关键字:内存 #define 是否 常使用 常量      更新时间:2023-10-16

我了解每个是如何工作的,但我很好奇其中一个是否真的在内存方面更有效。 #define 似乎一直在嵌入式 C 世界中使用,但我想知道它是否真的在大多数时候是合理的。

如果一个比另一个更有效,有人有办法测试和展示这一点吗?

让我们把#define放在一边,因为它在你的程序中并不真正存在。预处理器获取宏并在编译器发现它们曾经存在之前对其进行扩展。

以下来源:

#define X 42
printf("%d", X);

实际上是以下程序:

printf("%d", 42);

所以你要问的是,这需要更多还是更少的内存,而不是:

const int x = 42;
printf("%d", x);

这是一个我们无法完全回答的问题。

一方面,42的值需要存在于程序中的某个地方,否则执行它的计算机将不知道该怎么做。

另一方面,它可以在您的程序中进行硬编码,经过优化,也可以在运行时再次拉出时安装到内存中。

无论哪种方式,它都需要 32 位(可能不是 32 位),并且如何将它引入程序并不重要。

任何进一步的分析都取决于您对该值的确切操作。

这取决于您是否采用常量的地址。 如果您获取常量的地址,则编译器可以毫无问题地将其折叠到其他计算中并内联发出(作为即时或文字),就像 #define d 版本一样。 但是,如果您编写:

const int c = 42;
const int *pc = &c;

然后,c的副本必须位于全局.rodata部分中才能获取其地址,在编译器决定内联的任何副本上添加sizeof(int)字节的Flash空间;但是,编译器可能能够从内存中获取该常量,而不是将其合并为内联文本。 取决于它的值和您正在编译的 CPU。

尝试以每种方式编译一些代码并查看生成的汇编程序列表......