C-确实使变量成为const或最终保存字节或内存



我一直在使用一个程序,并且我一直在尝试保存字节和存储空间。

我的C程序中有很多变量,但是我想知道是否可以通过制作一些在整个程序constfinal中不变的变量来减小程序的大小。

所以我的问题是:

  • 将静态变量识别为constant
  • 时是否保存任何字节
  • 如果通过这样做来保存字节,为什么保存它们?如果该程序是constant,该程序将如何以不同的方式存储该变量,为什么这样需要更少的存储空间?
  • 如果通过将变量定义为constant来保存字节,那么开发人员为什么首先会这样定义变量?我们不仅可以忽略const,以防万一我们需要以后更改变量(尤其是在这样做的情况下没有挫败的情况下(?
  • 是否只有一些IDE/语言可以将字节保存为constant变量?

感谢您的任何帮助,非常感谢。

我想您正在研究深层嵌入式系统(例如Cortex-M处理器(。为此,您知道SRAM是一个稀缺的资源,而您有很多闪存。然后,尽可能多地使用 const 关键字来适用于任何不更改的变量。这样做将告诉编译器将变量存储在闪存中,而不是在SRAM中存储。

例如,要在系统上存储文本,您可以执行此操作:

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

然后,不仅文本存储在闪存中,还存储了其指针。

您的所有问题都在很大程度上取决于编译器和环境。用于嵌入式环境的C编译器可以在保存内存方面做得很好,而其他则可能不是。

将静态变量识别为常数时是否保存任何字节?

是的,这可能是可能的。但是请注意,通常," const"并不是要指定如何存储变量 - 而是它的含义是帮助程序员和编译器更好地理解源代码(当编译器"更好地理解"时,它可以产生更好的对象代码(。某些编译器可以使用该信息将变量存储在只读内存中,或将其删除并将其转换为对象代码中的文字。但是在您的问题的背景下,可能是#define更合适。

如果通过这样做来保存字节,为什么保存它们?如果程序是恒定的,则该程序如何以不同的方式存储该变量,为什么这种方式需要更少的存储空间?

源代码中声明的变量可以转到对象代码中的不同位置,而当对象文件加载并执行时,可以使用不同的位置。请注意,同样,各种体系结构存在差异 - 例如,在一个小的8/16位MCU(用于电子设备的CPU(中,通常没有对象文件的"加载"。因此,变量的值被存储在某个地方 - 无论如何。但是在低级别,编译器可以使用文字而不是地址,这主要节省了一些内存。假设您在源代码中声明恒定变量增益= 5。当该变量在某些公式中使用时,编译器会发出诸如" LD R12,增益"之类的(加载寄存器R12带有地址增益的内容,存储可变增益的内容(。但是编译器还可以发射" LD R12,#5"(在R12中加载值" 5"(。在这两种情况下,都需要指令,但是在第二种情况下,涉及变量没有记忆。这是一种节省,也可以更快。

如果不会通过将变量定义为常数来保存字节,那么开发人员为什么首先会以这种方式定义变量?我们不仅可以忽略台

如前所述," const"关键字旨在更好地定义在变量上将执行哪些操作。为了清楚起见,这对程序员很有用。清楚地表明,变量不是要修改的,尤其是当变量是正式参数时,这是有用的。在某些环境中,实际上只有一些只能读取的内存,只能被读取而不写入,并且,如果变量(也许是"系统变量"(标记为" const",那么程序员和 - 都清楚了 - 编译器,可以警告如果它遇到试图修改该变量的代码。

是否只有一些IDE/语言可以保存具有恒定变量的字节?

绝对是。但是不要谈论IDE:他们只是编辑。关于语言,事情很复杂:这完全取决于实施和优化。这种节省可能仅在编译器(不是解释器(中使用,并且很大程度上取决于编译器的优化选项/功能。

以这种方式考虑const(C中没有finalconstant的内容,所以我会忽略它(。如果编译器可以节省内存,则它将(尤其是在编译大小优化时(。const为编译器提供了有关对象属性的更多信息。当编译器具有更多信息时,编译器可以做出更智能的决定,并且不会阻止编译器做出与以前拥有该信息完全相同的决定。

它不会受到伤害,也可能会有所帮助,并且还可以帮助程序员使用代码的工作,从而更轻松地解决它。编译器和程序员都得到了帮助,没有人受伤。这是双赢。

编译器可以根据代码知识减少使用的内存,const帮助编译器知道真实的代码行为(如果您激活警告,则可以拥有建议放置const(。

但是,由于使用的HW的对齐限制,并且编译器无法改变结构的内部顺序,因此结构可以包含未使用的字节。这只能更改代码。

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'之间具有空的空间。在结构紧凑的情况下,情况并非如此,因为这些元素是从最宽的元素列出的,这可能需要更大的对齐,以较小。

在同一情况下,结构紧凑型甚至更快地代码。

最新更新