假设您的第一个目标是执行速度,然后是代码清洁度,最后是资源使用率。
如果在算法的某个点,一个变量(例如一个双精度数)不再改变(但你仍然要读很多次),你会把它复制成一个常量值吗?
假设您的第一个目标是执行速度,然后是代码清洁度,最后是资源使用率。
如果在算法的某个点,一个变量(例如一个双精度数)不再改变(但你仍然要读很多次),你会把它复制成一个常量值吗?
如果你想让你的代码更清晰,无论如何,将你的值复制到 aconst double const_value = calculated_value;
中,但是编译器非常擅长跟踪依赖关系,并且极不可能(假设你使用的是现代、合理的编译器)代码将是任何更快或以其他方式“更好”,因为您这样做。编译器很有可能会因为您需要第二个变量这一事实而接受您的话,从而制作副本,并因此使代码变慢。
与往常一样,如果性能对您的应用程序很重要,请为您的特定代码制作“之前和之后”的比较基准,因为在 Internet 上阅读页面或在 SO 上询问与对代码进行基准测试不同。
只是将非常量变量复制到一个常量中并不能使代码更清晰,因为你有两个变量而不是一个变量。更有趣的是将非常数移出范围。这样,我们只有变量可见的常量版本,编译器可以防止我们错误地更改它的值。
Herb Sutter 描述了如何使用 C++11 lambdas 来做到这一点:Complex initialization for a const variable。
const int i = [&]{
int i = some_default_value;
if(someConditionIstrue)
{
Do some operations and calculate the value of i;
i = some calculated value;
}
return i;
} ();
(我不解释执行速度目标,因为它已经由 Mats Petersson 完成)。
为了更好的代码可读性,您可以在变量不再更改的位置创建对变量的 const 引用,并从该点开始使用 const 引用。
double value_init;
// Some code that generates value_init...
const double& value = value_init;
// Use value from now on in your algorithm