C 额外的括号对性能有影响吗?

C 额外的括号对性能有影响吗?,c,C,我有一个C语言的程序,它使用了大量的数学计算,在计算过程中的某些地方,表达式有许多多余的括号和大括号 eg: ((x*y)+(((z*c)))) 它会降低性能吗?我们应该避免吗?不,这不应该影响执行时间,因为编译器将简化表达式 它可能会对编译时间产生微小的影响,但请注意“分钟”这个词——你甚至都不会注意到 更大的影响将是任何开发人员阅读该代码。多余的括号可能会使它更难理解,或者在它们咒骂给它们造成如此垃圾的编码者时,可能会使它们延迟一点:-)不,我将介绍典型的编译器阶段,并向您展示它们为什么不

我有一个C语言的程序,它使用了大量的数学计算,在计算过程中的某些地方,表达式有许多多余的括号和大括号

eg: ((x*y)+(((z*c))))

它会降低性能吗?我们应该避免吗?

不,这不应该影响执行时间,因为编译器将简化表达式

它可能会对编译时间产生微小的影响,但请注意“分钟”这个词——你甚至都不会注意到


更大的影响将是任何开发人员阅读该代码。多余的括号可能会使它更难理解,或者在它们咒骂给它们造成如此垃圾的编码者时,可能会使它们延迟一点:-)

不,我将介绍典型的编译器阶段,并向您展示它们为什么不这样做

编译的第一阶段是词法分析,将字符(或字符序列)转换为标记。表达式
((x*y)+((z*c))
可能被标记为:

LEFT_PAREN
LEFT_PAREN
ID x
SYMBOL *
ID y
RIGHT_PAREN
SYMBOL +
LEFT_PAREN
LEFT_PAREN
LEFT_PAREN
ID z
SYMBOL *
ID c
RIGHT_PAREN
RIGHT_PAREN
RIGHT_PAREN
RIGHT_PAREN
RIGHT_PAREN
在此之后,解析器开始构建解析树(并丢弃不再需要的东西,如括号)。解析树可能如下所示:

      +
     / \
    /   \
   /     \
  *       *
 / \     / \
X   Y   Z   C

括号此时不再存在,因此不会影响编译阶段的其余部分(包括代码生成)。表达式的求值顺序(添加圆括号的整个点)隐式编码在树本身的结构中,因此圆括号不再有用途,将被丢弃。当然,在词法分析和解析过程中,必须对它们进行处理,给编译时间增加一些纳秒,但仅此而已。除此之外,它们不存在,因此不会影响执行时间。

虽然这可能会降低编译时间。我认为验证括号的正确性可能会增加开销。但是,正如您在这里所做的,不需要使用括号,在使其易于阅读方面没有做太多工作,你应该避免这样做的唯一原因是它看起来像是在C++中混合了Lisp错误。@谢谢你的帮助,编译器不仅简化了表达式,括号也不只是在解析阶段之后,而且在解析树被建立之后。你是在预设编译器的工作方式。虽然您可能是对的(在0.00000001%以内),但我们不能保证编译器甚至使用解析树:-)@paxdiablo:那么您实际上也是在猜测。如果您不知道编译器正在使用解析树,或者目标平台上不存在括号,或者编译器对括号进行了优化,那么您就不知道括号没有运行时开销。我认为标准中没有关于附加括号性能的任何内容,是吗?@JurajBlaho,这就是为什么我说“不应该”而不是“不会”。你也应该注意到我之前评论末尾的笑脸。我不怀疑玉米秸秆在这一点上是正确的。而且你完全正确,尽管有复杂的需求,C和C++的运行时行为标准,但它们并不集中于编译过程本身的性能。