1

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

  1. #define CONSTANT 0
  2. extern int CONSTANT = 0;
  3. const int CONSTANT = 0;
  4. (3. 和 4 的一些混合。)
  5. enum ...(对于多个常数)

同样,我想防止在内存中一遍又一遍地存储这些值。所以如果我有

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

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

4

2 回答 2

1

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

是的,常量将被存储不止一次,但这比指向常量存储不止一次的指针更可取。

于 2013-06-07T21:48:43.913 回答
1

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

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

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

于 2013-06-07T21:52:59.487 回答