我一直想知道,在可以的情况下始终优先使用参数是否是一种好的做法const
?一方面,你告诉编译器这个变量不会在函数范围内发生变异,因此它可以在后台进行优化,但另一方面,由于参数是通过复制传递的,因此它不会影响调用者,因此它会使代码const
到处都是 s 而变得臃肿,从而降低可读性。
有人知道编译器在参数上做了哪些优化吗const
?例如,它可以通过传递变量作为引用而不复制它来进行优化吗?是否存在我们应该注意的并发影响?(例如,在函数运行时在另一个线程中改变变量时)。
其优点是否值得其缺点?
在有效的变量定义上使用顶层具有优化优点
const
(任何定义的地方,不仅仅是在函数定义中的参数中)。变量的顶层
const
会导致任何修改对象值的尝试产生未定义的行为。因此,编译器可以推断出其值永远不会改变,即使指向它的指针逃逸到某个未知函数。如果没有这一点,任何此类指针逃逸都要求编译器必须假设对象的值可能会被任何未知调用更改。即使函数采用指向的指针也是如此,因为与定义中的
const
顶层不同,这对于优化没有任何意义,纯粹是为了让程序员能够推理代码并避免语义错误而存在的。const
const
我没有看到任何缺点,只是代码有时会因为关键字样板而变得更难阅读。可能会有轻微的风险,即某些东西被意外定义,而
const
实际上被修改,从而导致 UB。但是,如果在编写代码时考虑到了const
正确性,那么这种情况应该不太可能发生。显式转换始终是丢弃const
限定符而违反const
正确性的潜在风险。来自 C17 6.5.2.2 第 2 段:
来自 C17 6.7.6.3 第 15 段:
这实际上意味着
const
函数参数的直接类型中的限定符会被调用者忽略,并且仅对被调用函数本身有意义,它们的作用与局部变量中的限定符相同。这也意味着这些函数声明是兼容的:
如果该参数在函数定义中声明
const
,则编译器可以将该参数视为const
使用初始化程序定义的变量:在共享头文件中声明函数时,我建议声明不带限定符的参数,因为它与函数的调用者无关。