f(int const) 是否比 f(int) 更适合编译器优化?

xml*_*lmx 0 c++ optimization performance constants compiler-optimization

考虑以下两个函数:

void f(int n);

void f(int const n);
Run Code Online (Sandbox Code Playgroud)

从编译器优化的角度来看,后者似乎比前者更好。

然而,从调用者的角度来看,比 .int const n拥有更多的无用信息更多的精神负担int n

哪个是更好的做法?

Chr*_*isB 8

TLDR:实际上,这样做的性能优势为零。使用 const 是为了清晰和可读性,而不是为了性能。

由于const函数参数甚至不是函数签名的一部分,因此无论您的 ABI 如何,这两个函数都将具有完全相同的调用约定。这意味着呼叫者的利益为零。

在函数本身内部,对const编译器也没有多大帮助。任何值得信赖的编译器都可以自行判断您是否正在修改n.

构建病态案例是可能的,其中const 可能允许编译器假设某些事情。例如,我们n作为(非常量)指针传递给的嵌套函数调用不会修改它。这可以让编译器更好地进行存储 -> 加载转发并避免溢出到堆栈。就目前情况而言,编译器似乎甚至没有利用这一点(https://godbolt.org/z/jGsKo56aG)。

  • 更糟糕的是,const 对象可能是可变的。如果将它与继承和虚拟性结合起来,那么这意味着编译器甚至不能假设 const ref 确实是 const。多么伟大的语言啊... (4认同)