大多数RAM有效的方式来引用C中的整数常量

时间:2013-06-07 21:37:09

标签: c performance memory constants

我正在研究微控制器/传感器设备的应用程序。我的问题是,以这种方式存储命名常量的最有效内存的方法是什么?它们可以从其他位置引用?理想情况下,我们希望避免一次又一次地将相同的值存储在RAM / ROM中。显而易见的选择是

  1. #define CONSTANT 0
  2. extern int CONSTANT = 0;
  3. const int CONSTANT = 0;
  4. (3和4的混合。)
  5. enum ...(针对多个常量)
  6. 同样,我想防止在内存中反复存储这些值。所以,如果我有

    if (CONSTANT == x)
    {
        ...
    }
    ...
    y = CONSTANT;
    

    目标是防止CONSTANT被存储两次。也许这是一个编译器优化问题,或者我认为是不可能的,因为你最终必须存储一个指针并从中读取,使得更少效率比首先存储多个副本

2 个答案:

答案 0 :(得分:1)

对于#defineenum,编译器将能够将整数常量编码到生成的指令中。它也可以使用const int来完成,但这取决于编译器的优化功能。 extern几乎总是需要引用一个地址,这意味着该值将在其他地方占用内存。

是的,常量将被存储多次,但这对于指针优于存储的常量不止一次。

答案 1 :(得分:1)

正如您所注意到的,当常量的大小小于或等于内存地址的大小时,在内存的 data 区域中存储整数常量不会节省内存。这是因为任何引用该存储常量的机器指令都必须存储其地址。 int个对象的大小通常小于或等于机器地址的大小。因此,对于int常量,将它们直接嵌入到机器指令中更有意义,而不是将它们存储在 data 区域中。

如果我们以最直接的方式解释C语言的规范,那就意味着你必须使用#defineenum - 只有这些C语言结构才能正式生成真正的常量。当然,没有什么能阻止C编译器优化代码并将[static] const int对象视为真正的常量,即使它们不被语言的正式定义识别。你必须测试你的编译器,看它是否这样做。

在没有初始值设定项的某些翻译单元中声明的extern const int对象无法嵌入到该翻译单元的机器指令中,这意味着extern const int不能很好地用于此目的(除非您的编译器能够全局优化)。