const通常使用比#define更多或更少的内存吗?

时间:2014-12-23 20:28:32

标签: c++ c embedded const

我理解每一个是如何工作的,但我很好奇,如果其中一个实际上更有效地记忆。 #define似乎一直在嵌入式C世界中使用,但我想知道它是否在大多数情况下在const上实际上是合理的。

如果一个人比另一个人更有效率,有没有人有办法测试并显示这个?

2 个答案:

答案 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。

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