C++ 调用函数并使用结果调用另一个函数的有效方法

C++ 调用函数并使用结果调用另一个函数的有效方法,c++,optimization,C++,Optimization,我是一个业余爱好者,正在为一个个人项目学习一些OpenGL;我对C++没有最深刻的理解(现在我没问题),所以我很抱歉这是一个愚蠢的或明显的问题。 假设这段代码在游戏循环的每一个滴答声中都运行,我想知道每种方法(如果有的话)的优缺点: glm::vec3 camera_pos = g_Camera->GetPosition(); some_func(camera_pos.x, camera_pos.y, camera_pos.z); vs: 我的直觉是,第1个版本的性能更好,因为它只是一

我是一个业余爱好者,正在为一个个人项目学习一些OpenGL;我对C++没有最深刻的理解(现在我没问题),所以我很抱歉这是一个愚蠢的或明显的问题。 假设这段代码在游戏循环的每一个滴答声中都运行,我想知道每种方法(如果有的话)的优缺点:

glm::vec3 camera_pos = g_Camera->GetPosition();

some_func(camera_pos.x, camera_pos.y, camera_pos.z);
vs:


我的直觉是,第1个版本的性能更好,因为它只是一个函数调用,但我不确定编译器是否会优化第2个版本,使总体上没有差异?为了方便和可读性,我更愿意使用第二个版本,但我最想做的是更高效的事情。我尽量不做太多过早的优化,但这是我一直在思考的问题。

无论您使用什么编译器,都可能会对其进行优化。在某些情况下,它无法做到这一点。例如,如果getPosition需要计算、不是幂等函数或是虚拟调用,则它可能无法对其进行优化

这里可能不是这样。使用你的第一个版本。它更具可读性,更易于调试


当有疑问时,您可以编译成汇编或其他程序,看看是否有任何差异,或者您可以立即传递整个结果

如果
某些函数看起来像:

void some_func(const glm::vec3& pos) {...}
然后你可以这样称呼它:

some_func(g_Camera->GetPosition());

如果你的问题是“创建中间变量是否会对性能产生负面影响”,我会说不。编译器将尽可能优化它,如果可能的话,可以内联它。为了便于阅读,我会把它分开。这似乎是预优化;即使是游戏循环。第二个可能会被优化,但这取决于你的编译器,如果你的目标是游戏机,那么一般的建议是不要假设任何东西。实际上,我认为第一个更具可读性,但我想这是基于观点的,假设
g_Camera->GetPosition()
返回一个对向量的常量引用,您可以只公开该常量引用,而不使用函数来返回一个(但这可能有点太过分了,我可能会胡说)。太长,读不下去了你想用什么就用什么也许根本不重要,但第一种更常见。我不会事先考虑这样的微观优化。试着先以一种更简洁易读的方式编写代码。您可以稍后运行探查器来确定游戏的真正瓶颈。@mjkjr:对于这些微优化案例,最好不要考虑编译器可以或不能减少的操作太多。相反,将每个优化步骤视为优化器处理的附加复杂性。一个或几个通常是好的,但总有一个阈值,超过这个阈值编译器就会有效地放弃,如果您运气不好,只是无意中添加了最后一根稻草,那么这个阈值可能会灾难性地失败。因此,在大多数情况下,编写简单易读的代码,但在处理关键的内部循环时,明确您所期望的内容通常会有所帮助。@George,是的,我试图不完全暴露位置向量,因为我只希望摄影机对象本身负责直接修改该值,我希望这是有保证的。谢谢,这是我想的,但我只是好奇是否有其他观点我可能错过了。不幸的是,它没有,它不是我的功能,所以我也不能更改它。我将它传递给OpenGL库函数glUniform3f(GLint location,GLfloat v0,GLfloat v1,GLfloat v2),它没有接受向量的版本。
some_func(g_Camera->GetPosition());