常量是否比通常使用 #define 更多或更少的内存
Does const use more or less memory than #define typically?
我了解每个是如何工作的,但我很好奇其中一个是否真的在内存方面更有效。 #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
的副本必须位于全局.rodata
部分中才能获取其地址,在编译器决定内联的任何副本上添加sizeof(int)
字节的Flash空间;但是,编译器可能能够从内存中获取该常量,而不是将其合并为内联文本。 取决于它的值和您正在编译的 CPU。
尝试以每种方式编译一些代码并查看生成的汇编程序列表......
相关文章:
- 将字符串存储在c++中的稳定内存中
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- Win32编译器选项和内存分配
- 当vector是tje全局变量时,c++中vector的内存管理
- 带内存和隔离功能的SQLite
- 是否可以通过C++扩展强制多个python进程共享同一内存
- 迭代时从向量和内存中删除对象
- 在C++中打印指向不同基元数据类型的指针的内存地址
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 为什么示例代码访问IUnknown中已删除的内存
- 如何在C++类内存结构中创建"spacer"?
- 从构造函数抛出异常时如何克服内存泄漏
- malloc() 可能出现内存泄漏
- 如何理解将半精度指针转换为无符号长指针和相关的内存对齐
- 在调用FreeLibrary后,释放动态链接到具有相同版本的CRT堆的DLL的内存
- 如何针对特定情况调试和修复此双自由内存损坏问题
- 由于标头中的 #define 不匹配而导致内存损坏
- 在性能和内存使用方面,“静态const”,“ #define”和“枚举”之间的差异
- 常量是否比通常使用 #define 更多或更少的内存