我知道使用静态定义(例如:)static int toto;
是为了使函数或变量只能在本地文件中看到,而不是在整个源代码中看到。
我想知道静态定义是否有影响:
- 关于二进制程序执行的性能?
- 关于优化代码内存的内存大小?
- 关于优化数据内存的内存大小?
这通常是不可能回答的,因为它实际上取决于你的编译器有多聪明,你如何编译等等。
它可能使编译器更容易优化您的代码(例如,完全删除变量或内联函数,因为它知道它永远不会从外部调用;即使您只是编译这个单个翻译单元)。然而,这实际上取决于编译器以及变量或函数的使用方式(例如,在函数中使用它之前是否总是初始化)。
因此,正确使用它可能会对执行时间以及代码大小和内存使用产生积极影响。
至于static
函数中的变量,情况可能完全不同(因为您可能会保留先前调用的变量,这可能会阻止它被删除)。
static 只是使变量或函数在当前翻译单元(当前源文件)中可见的方法。这意味着global static
变量具有internal linkage
.
因此,当然,构建每个标识符都具有内部链接的任何可执行文件都会更快,因为链接器无需解析外部符号或更少数量的外部符号。
但是不知道平台、编译器和版本就不能肯定,所以这只是一个笼统的解释
给出一个通用的答案非常困难,因为它取决于编译器和用例:
关于二进制程序执行的性能?
这取决于该值是否确定为常数,如果是,则其在高优化级别下传播和折叠。它还取决于它是在函数内还是在 TU 范围内是静态的。在 TU 范围内,它将被视为与任何其他 BSS 分配的变量相同,只有多个副本。在函数级别,与堆栈或寄存器局部变量相比,地址间接会增加相当多的开销(然而,L1 缓存会减轻大部分开销)。
关于优化代码内存的内存大小?
它不应该影响代码的内存大小,除了函数静态变量的情况,它不能被堆栈分配,因此需要内存地址访问,这增加了每次存储和加载的地址访问开销。不过,在大多数系统下,实际尺寸的增加可以忽略不计。
关于优化数据内存的内存大小?
取决于制作了多少副本,这取决于它包含多少个 TU(例如:可以为每个包含头的 TU 创建静态头变量)。
实际上,正如马里奥指出的那样,定义static
一个局部变量告诉编译器在成功调用之间保留其值;这可能会产生很多影响。大多数情况下,这个变量成为一个“模块全局”变量,因此不会进入堆栈(我指的是嵌入式 fw);
另一个影响是,如果您在static
同时从不同线程调用的函数中使用 var ,则会获得不同(较低)的 RAM 使用率(当然,行为也非常不同)。
一个普遍的答案是:“它不能让它变得更糟,但它可以让它变得更好”。static 和 const 等做两件事——它们限制了你可以做什么,它们允许编译器做出更好的决定。编译器不必做出这些决定,但它可以,所以它不会受到伤害,如果你幸运的话,它会有所帮助。