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