Ass*_*azi 3 c variables final constants
我一直在使用一个程序,我一直在努力节省字节和存储空间.
我在我的C程序中的变量很多,但我想知道如果我可以通过做一些这两个变量的减少程序的大小不会改变整个程序const或final.
所以我的问题是:
constant?constant,为什么这种方式需要更少的存储空间?constant,那么为什么开发人员首先会以这种方式定义变量?我们是否可以省略以防const万一我们以后需要更改变量(特别是如果这样做没有垮台)?constant变量保存字节?感谢您的帮助,非常感谢.
小智 5
我认为你正在研究深度嵌入式系统(如cortex-M处理器).对于这些,您知道SRAM是一种稀缺资源,而您有足够的FLASH存储器.然后尽可能多地使用const关键字来表示任何不会改变的变量.这样做会告诉编译器将变量存储在FLASH存储器中而不是存储在SRAM中.
例如,要在系统上存储文本,您可以执行以下操作:
const char* const txtMenuRoot[] = { "Hello, this is the root menu", "Another text" };
Run Code Online (Sandbox Code Playgroud)
然后不仅文本存储在FLASH中,还存储在其指针中.
您的所有问题在很大程度上取决于编译器和环境。用于嵌入式环境的 AC 编译器可以在节省内存方面做得很好,而其他编译器可能不会。
将静态变量识别为常量时是否有字节节省?
是的,这也许是可能的。但请注意,“const”通常并不是为了指定如何存储变量 - 相反,它的含义是帮助程序员和编译器更好地理解源代码(当编译器“更好地理解”时,它可以生成更好的目标代码)。某些编译器可以使用该信息将变量存储在只读内存中,或者删除它并将其转换为目标代码中的文字。但就你的问题而言,可能 a#define更合适。
如果这样做可以节省字节,为什么会节省它们?如果变量是常量,程序如何以不同的方式存储变量,为什么这种方式需要更少的存储空间?
源代码中声明的变量可以转到目标代码中的不同位置,以及目标文件加载到内存中并执行时的不同位置。再次注意,各种架构之间存在差异 - 例如,在小型 8/16 位 MCU(电子设备的 CPU)中,通常不“加载”目标文件。所以无论如何,变量的值都存储在某个地方。但在低级别,编译器可以使用文字而不是地址,这主要节省一些内存。假设您在源代码中声明了一个常量变量 GAIN=5。当在某些公式中使用该变量时,编译器会发出类似“LD R12,GAIN”的信息(将地址 GAIN 的内容加载到寄存器 R12,其中存储变量 GAIN)。但编译器也可以发出“LD R12,#5”(在 R12 中加载值“5”)。在这两种情况下都需要一条指令,但在第二种情况下,没有用于存储所涉及变量的内存。这样既节省了,也可以更快。
如果通过将变量定义为常量不能节省字节,那么为什么开发人员首先要以这种方式定义变量呢?难道我们不能忽略 const 以防万一以后需要更改变量(特别是如果这样做不会造成任何损失)?
如前所述,“const”关键字旨在更好地定义将对变量执行哪些操作。为了清晰起见,这对程序员很有用。明确声明变量不打算被修改是有用的,特别是当变量是形式参数时。在某些环境中,实际上存在一些只能读取而不能写入的只读内存,如果一个变量(可能是“系统变量”)被标记为“const”,那么程序员就清楚了 - 并且 -编译器,如果遇到尝试修改该变量的代码,它会发出警告。
只有某些 IDE/语言可以用常量变量保存字节吗?
绝对是的。但不要谈论 IDE:它们只是编辑器。对于语言来说,事情很复杂:它完全取决于实现和优化。可能这种保存仅在编译器(而不是解释器)中使用,并且在很大程度上取决于编译器的优化选项/功能。