我理解每一个是如何工作的,但我很好奇,如果其中一个实际上更有效地记忆。 #define似乎一直在嵌入式C世界中使用,但我想知道它是否在大多数情况下在const上实际上是合理的。
如果一个人比另一个人更有效率,有没有人有办法测试并显示这个?
答案 0 :(得分:4)
让我们把#define
放在一边,因为它在你的程序中并不存在。在编译器甚至发现它们曾经存在之前,预处理器会接受您的宏并对它们进行扩展。
以下来源:
#define X 42
printf("%d", X);
实际以下程序:
printf("%d", 42);
所以你要问的是这是否需要更多或更少的内存:
const int x = 42;
printf("%d", x);
这是一个我们无法完全回答的问题。
一方面,价值42
需要存在于您的程序某处,否则执行它的计算机将不知道该怎么做。
另一方面,它既可以在程序中硬编码,也可以进行优化,也可以在运行时安装到内存中再次拉出来。
无论哪种方式,它需要32位(可能不是32位),并且将它引入程序的方式并不重要。
任何进一步的分析都取决于准确地您正在使用该值做什么。
答案 1 :(得分:3)
这取决于你是否正在使用常数的地址。如果你不获取常量的地址,那么编译器将其折叠到其他计算中并将其内联(作为立即数或字面数)发送是没有问题的,就像#define
d一样版。但是,如果你写:
const int c = 42;
const int *pc = &c;
然后c
的副本必须存在于全局.rodata
部分才能获取其地址,在编译器决定内联的任何副本的顶部添加sizeof(int)
字节的Flash空间;但是,编译器可能能够以更低的成本从内存中获取该常量,而不是将其作为内联文字合并,具体取决于它的值和您正在编译的CPU。
尝试每种方式编译一些代码并查看生成的汇编程序列表......