使变量成为 const 或 final 是否节省字节或内存?

Does making a variable a const or final save bytes or memory?

我一直在使用一个程序,我一直在努力节省字节和存储空间 space。

我的 C 程序中有很多变量,但我想知道是否可以通过在整个程序中使用 don't change constfinal 的一些变量来减小程序的大小.

所以我的问题是:

感谢您的帮助,不胜感激。

我假设您正在开发深度嵌入式系统(如 cortex-M 处理器)。 对于这些,您知道 SRAM 是一种稀缺资源,而您拥有大量的闪存。 然后尽可能多地对任何不变的变量使用 const 关键字。 这样做会告诉编译器将变量存储在闪存中而不是 SRAM 中。

例如,要在您的系统上存储文本,您可以这样做:

const char* const txtMenuRoot[] = { "Hello, this is the root menu", "Another text" };

那么FLASH中不仅存储了文本,还存储了它的指针。

您所有的问题在很大程度上取决于编译器和环境。用于嵌入式环境的 C 编译器可以很好地节省内存,而其他编译器可能不会。

Is there any byte save when identifying static variables as constant?

是的,有可能。但请注意 "const",一般来说,并不是要指定如何存储一个变量——相反,它的意思是帮助程序员和编译器更好地理解源代码(当编译器 "understand better",它可以产生更好的目标代码)。一些编译器也可以使用该信息将变量存储在只读存储器中,或者将其删除并将其转换为目标代码中的文字。但在你的问题的上下文中,可能 #define 更合适。

If bytes are saved by doing this, why are they saved? How does the program store the variable differently if it is constant, and why does this way need less storage space?

在源代码中声明的变量可以在目标代码中到达不同的地方,并且当目标文件加载到内存中并执行时也可以到达不同的地方。请再次注意,各种体系结构存在差异 - 例如在小型 8/16 位 MCU(cpu 用于电子设备)中,通常没有 "loading" 目标文件。所以变量的值存储在某个地方 - 无论如何。但在低级别,编译器可以使用文字而不是地址,这主要节省了一些内存。假设您在源代码中声明了一个常量变量 GAIN=5。当在某些公式中使用该变量时,编译器会发出类似 "LD R12,GAIN" 的内容(将地址 GAIN 的内容加载到寄存器 R12,其中存储变量 GAIN)。但是编译器也可以发出 "LD R12,#5"(在 R12 中加载值“5”)。在这两种情况下都需要一条指令,但在第二种情况下没有涉及变量的内存。这是一个节省,也可以更快。

If bytes are not saved by defining variables as constant, then why would a developer define a variable this way in the first place? Could we not just leave out the const just in case we need to change the variable later (especially if there is no downfall in doing so)?

如前所述,"const" 关键字旨在更好地定义将对变量执行的操作。为清楚起见,这对程序员很有用。清楚地声明变量不打算被修改是很有用的,尤其是当变量是形式参数时。在某些环境中,实际上有一些只读内存只能读不能写,如果一个变量(可能是"system variable")被标记为"const",程序员就一清二楚了- 和 - 编译器,如果遇到试图修改该变量的代码,它会发出警告。

Are there only some IDEs/Languages that save bytes with constant variables?

当然可以。但不要谈论 IDE:它们只是编辑器。关于语言,事情很复杂:它完全取决于实现和优化。可能这种节省仅用于编译器(而不是解释器),并且在很大程度上取决于编译器的优化options/capabilities。

这样想 const(在 C 中没有 finalconstant 这样的东西,所以我将忽略它)。如果编译器有可能节省内存,它就会这样做(尤其是当您针对大小进行优化编译时)。 const 为编译器提供有关对象属性的更多信息。当编译器拥有更多信息时,它可以做出更明智的决定,并且不会阻止编译器做出与获得该信息之前完全相同的决定。

它不会有坏处而且可能会有所帮助,它还可以帮助使用代码的程序员更轻松地对其进行推理。编译器和程序员都得到了帮助,没有人受到伤害。这是双赢的。

编译器可以根据代码的知识减少使用的内存,const 帮助编译器了解真正的代码行为(如果激活警告,您可以建议将 const 放在哪里)。

但由于所用硬件的对齐限制,结构可能包含未使用的字节,并且编译器无法更改结构的内部顺序。只需更改代码即可完成此操作。

struct wide               struct compact
{                         {
    int_least32_t i1;             int_least32_t i1,
    int_least8_t b;                             i2;
    int_least32_t i2;             int_least8_t b;
}                         }

由于对齐限制,结构宽度可以在成员 'b' 和 'i2' 之间有一个空的 space。 这在 struct compact 中不是这种情况,因为元素是从最宽的元素到更小的元素列出的,这可能需要更大的对齐。

在相同的情况下,struct compact 甚至会导致更快的代码。