我正在研究微控制器/传感器设备的应用程序。我的问题是,以这种方式存储命名常量的最有效内存的方法是什么?它们可以从其他位置引用?理想情况下,我们希望避免一次又一次地将相同的值存储在RAM / ROM中。显而易见的选择是
#define CONSTANT 0
extern int CONSTANT = 0;
const int CONSTANT = 0;
enum ...
(针对多个常量)同样,我想防止在内存中反复存储这些值。所以,如果我有
if (CONSTANT == x)
{
...
}
...
y = CONSTANT;
目标是防止CONSTANT被存储两次。也许这是一个编译器优化问题,或者我认为是不可能的,因为你最终必须存储一个指针并从中读取,使得更少效率比首先存储多个副本
答案 0 :(得分:1)
对于#define
和enum
,编译器将能够将整数常量编码到生成的指令中。它也可以使用const int
来完成,但这取决于编译器的优化功能。 extern
几乎总是需要引用一个地址,这意味着该值将在其他地方占用内存。
是的,常量将被存储多次,但这对于指针优于存储的常量不止一次。
答案 1 :(得分:1)
正如您所注意到的,当常量的大小小于或等于内存地址的大小时,在内存的 data 区域中存储整数常量不会节省内存。这是因为任何引用该存储常量的机器指令都必须存储其地址。 int
个对象的大小通常小于或等于机器地址的大小。因此,对于int
常量,将它们直接嵌入到机器指令中更有意义,而不是将它们存储在 data 区域中。
如果我们以最直接的方式解释C语言的规范,那就意味着你必须使用#define
或enum
- 只有这些C语言结构才能正式生成真正的常量。当然,没有什么能阻止C编译器优化代码并将[static] const int
对象视为真正的常量,即使它们不被语言的正式定义识别。你必须测试你的编译器,看它是否这样做。
在没有初始值设定项的某些翻译单元中声明的extern const int
对象无法嵌入到该翻译单元的机器指令中,这意味着extern const int
不能很好地用于此目的(除非您的编译器能够全局优化)。