我们先把它放在#define一边,因为它并不真正存在于你的程序中。预处理器会在编译器发现宏之前就获取宏并对其进行扩展。
以下来源:
#define X 42
printf("%d", X);
Run Code Online (Sandbox Code Playgroud)
实际上是下面的程序:
printf("%d", 42);
Run Code Online (Sandbox Code Playgroud)
所以你要问的是,这是否需要比以下更多或更少的内存:
const int x = 42;
printf("%d", x);
Run Code Online (Sandbox Code Playgroud)
这是一个我们一般无法完全回答的问题。
一方面,该值42需要存在于程序中的某个位置,否则执行它的计算机将不知道该怎么做。
另一方面,它可以在您的程序中进行实时硬编码(经过优化),也可以在运行时安装到内存中并再次拉出。
无论哪种方式,它都需要 32 位(可能不是 32 位),并且如何将其引入程序中并不重要。
任何进一步的分析都取决于您对该值的处理方式。
这取决于您是否获取常量的地址。如果您不获取常量的地址,那么编译器可以毫无问题地将其折叠到其他计算中并内联发出它(作为立即数或文字),就像#defined 版本一样。但是,如果你写:
const int c = 42;
const int *pc = &c;
Run Code Online (Sandbox Code Playgroud)
那么 的副本c必须存在于全局.rodata部分中才能获取其地址,sizeof(int)在编译器决定内联的任何副本之上添加闪存空间字节;然而,编译器从内存中获取该常量的成本可能比将其合并为内联文字的成本要低,具体取决于它的值以及您要编译的 CPU。
尝试以每种方式编译一些代码并查看生成的汇编程序列表......