![](/img/trans.png)
[英]Does initializing references cost more memory if you copy to an lvalue less than the size of a reference?
[英]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.