使用const double作为中间结果

时间:2010-05-25 12:22:06

标签: c++ const

我正在编写一个模拟程序,并想知道在存储中间结果时是否使用const double是有用的。请考虑以下代码段:

double DoSomeCalculation(const AcModel &model) {
   (...)
   const double V = model.GetVelocity();
   const double m = model.GetMass();
   const double cos_gamma = cos(model.GetFlightPathAngleRad());
   (...)
   return m*V*cos_gamma*Chi_dot;
}

请注意,样本仅用于说明 - 从工程方面来看,它可能没有多大意义。在变量中存储例如cos_gamma的动机是这个余弦在(...)覆盖的其他表达式中多次使用,我觉得使用时代码更易读

cos_gamma 

而不是

cos(model.GetFlightPathAngleRad())

用各种表达方式。现在问题是这样的:因为我希望余弦在代码部分是相同的,我实际上只是作为占位符创建了东西,为了方便起见,我倾向于将它声明为const。是否有关于这是好还是坏的实际意见,或者它最终是否会咬我?编译器是否使用了这些附加信息,或者我是否真的阻碍了编译器执行有用的优化?

·阿尔

5 个答案:

答案 0 :(得分:6)

我不确定优化部分,但我认为将其声明为const是件好事。这是因为如果代码很大,那么如果有人错误地在中间执行cos_gamma = 1,则会出现编译器错误而不是运行时意外。

答案 1 :(得分:4)

你可以通过一次只计算余弦并在任何地方使用它来帮助你。取得结果const是确保您(或其他人)不会尝试在未来某个地方进行更改的好方法。

这里一个好的经验法则是首先使其正确和可读。不要担心编译器可能会或可能不会进行任何优化。只有在分析并发现一段代码确实太慢之后,您才会担心帮助编译器优化事物。

答案 2 :(得分:3)

鉴于你的代码:

const double V = model.GetVelocity();
const double m = model.GetMass();
const double cos_gamma = cos(model.GetFlightPathAngleRad());

我可能会离开cos_gamma。我考虑Vm更改为引用:

const double &V = model.GetVelocity();
const double &m = model.GetMass();

通过这种方式,您可以清楚地知道这些是严格的占位符。但是,它确实提高了终身问题的可能性 - 如果使用引用,您必须确保它所指的具有足够的寿命。至少从事物的外观来看,这可能不会成为问题。首先,GetVelocity()GetMass()可能返回值,而不是引用(在这种情况下,您使用临时值初始化引用,并且临时的生命周期延长到它初始化的引用的生命周期) )。其次,即使你返回一个实际的引用,它显然也是model的一个成员,无论如何,它(在一个猜测中)将存在于整个计算中。

答案 3 :(得分:2)

我希望我能使用更多这样编写的代码!

你可以做的任何让你的代码更具可读性只会是一件好事。仅在需要优化时进行优化。

我对C ++最大的兴趣是默认情况下值不是const。宽大地使用const并保持你的脚孔免费!

答案 4 :(得分:0)

编译器是否使用它是一个有趣的问题 - 一旦你处于优化完全工作程序的阶段。在那之前,你编写的程序主要是为了后来的人类而不得不查看代码。编译器很乐意(客观地)吞下非常难以理解的代码,缺少空格,换行符和运动搞笑缩进。人类不会 最重要的问题是, 代码的可读性 更改错误是多么容易 。在这里,const有很大的帮助,因为它会使编译器对每个错误地改变任何不应该改变的东西的人发出警告。我总是把所有东西const都做成,除非我真的,真的希望它可以改变。