繁体   English   中英

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

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

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

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

#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部分中以便获取其地址,在编译器决定内联的任何副本的顶部添加.rodata空间的sizeof(int)字节; 但是,编译器可能能够以更低的成本从内存中获取该常量,而不是将其作为内联文字合并,具体取决于其值和您正在编译的CPU。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM