将函数参数复制到 const 局部变量
Copy function parameter to const local variable
我在 glm 库中挖掘,发现了这种类型的代码,还有一些其他类似的东西。我的问题是:将函数参数复制到函数内部的 const 局部变量的目的是什么,就像这样 -- T const a(angle)。是为了一些性能优势吗?
template<typename T, qualifier Q>
GLM_FUNC_QUALIFIER qua<T, Q> angleAxis(T const& angle, vec<3, T, Q> const& v)
{
T const a(angle);
T const s = glm::sin(a * static_cast<T>(0.5));
return qua<T, Q>(glm::cos(a * static_cast<T>(0.5)), v * s);
}
没有目的。
这可能是为了避免重复访问 angle
的间接访问而误入歧途(作为引用,编译器可能将其实现为指针)。这是否超过复制的成本并不明显:如果类型 T
很小并且 trivially copyable 那么制作副本是免费的,但对于更大的类型,这实际上会产生不小的开销。另一方面,编译器通常可以完全避免重复的指针访问。
不管这些考虑,如果优化是目的,那么按值传递 angle
会更合适:先按引用传递,然后再传递在本地复制确实没有任何意义。
我在 glm 库中挖掘,发现了这种类型的代码,还有一些其他类似的东西。我的问题是:将函数参数复制到函数内部的 const 局部变量的目的是什么,就像这样 -- T const a(angle)。是为了一些性能优势吗?
template<typename T, qualifier Q>
GLM_FUNC_QUALIFIER qua<T, Q> angleAxis(T const& angle, vec<3, T, Q> const& v)
{
T const a(angle);
T const s = glm::sin(a * static_cast<T>(0.5));
return qua<T, Q>(glm::cos(a * static_cast<T>(0.5)), v * s);
}
没有目的。
这可能是为了避免重复访问 angle
的间接访问而误入歧途(作为引用,编译器可能将其实现为指针)。这是否超过复制的成本并不明显:如果类型 T
很小并且 trivially copyable 那么制作副本是免费的,但对于更大的类型,这实际上会产生不小的开销。另一方面,编译器通常可以完全避免重复的指针访问。
不管这些考虑,如果优化是目的,那么按值传递 angle
会更合适:先按引用传递,然后再传递在本地复制确实没有任何意义。