Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/164.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ const使用的内存比#通常定义的多还是少?_C++_C_Embedded_Constants - Fatal编程技术网

C++ const使用的内存比#通常定义的多还是少?

C++ const使用的内存比#通常定义的多还是少?,c++,c,embedded,constants,C++,C,Embedded,Constants,我理解每一个是如何工作的,但我很好奇,这两者是否真的更有效#define似乎在嵌入式C世界中一直被使用,但我想知道它是否在大多数情况下都是正确的 如果其中一个比另一个更有效,有没有人有办法测试和展示这一点?让我们把#define放在一边,因为它实际上并不存在于您的程序中。在编译器发现宏之前,预处理器将获取宏并展开它们 以下资料来源: #define X 42 printf("%d", X); 实际上是以下程序: printf("%d", 42); 因此,您要问的是,这是占用更多还是更少的内存

我理解每一个是如何工作的,但我很好奇,这两者是否真的更有效#define似乎在嵌入式C世界中一直被使用,但我想知道它是否在大多数情况下都是正确的

如果其中一个比另一个更有效,有没有人有办法测试和展示这一点?

让我们把
#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
的副本必须存在于global
.rodata
部分,以便获取其地址,在编译器决定内联的任何副本上添加
sizeof(int)
字节的闪存空间;然而,编译器从内存中获取该常量的成本可能比将其合并为内联文本要低,这取决于它的值和编译的CPU


尝试每种方式编译一些代码,并查看生成的汇编程序清单…

您显然不了解每种方式的工作原理。对不起,好的。。。我很抱歉在提出这个问题之前没有支持我的定义知识,我只是想暂时保持它的简单。在这里看到了双方的一些观点。我想我会尝试充实出一个更好的答案…常量只使用一次内存,在只读内存中,它是通过代码访问的。#define在使用#define名称的每个点都插入了它的文本。如果#define值可以合并为单个机器指令的一部分,那么不管它被引用了多少次,它将比const增加更少的ram总使用量,因为const需要代码生成指向它的指针,并需要代码实际检索它。但是,如果#define不能合并到一条指令中,那么const很容易占用更少的总ram。因此答案是:“这取决于”传统上,嵌入式设备制造商提供自己的编译器,而且在优化方面非常糟糕,因此为了节省内存,首选
#define
。当然,
const
变量不是常量表达式,因此在某些情况下,您甚至没有该选项。@radix07:不幸的是,我不相信您理解我的答案。为什么你认为“必须有一个总体的想法”?