用c++更快地调用方法

Faster way to call a method in c++

本文关键字:调用 方法 c++      更新时间:2023-10-16

快速提问,如果听起来很天真,我深表歉意。c++中什么更快。像这样的代码:

ProgramsManager::CurrentProgram->Uniforms->Set(n1);
ProgramsManager::CurrentProgram->Uniforms->Set(n2);
ProgramsManager::CurrentProgram->Uniforms->Set(n3);
ProgramsManager::CurrentProgram->Uniforms->Set(...);

还是这个?

Uniforms* u = ProgramsManager::CurrentProgram->Uniforms;
u->Set(n1);
u->Set(n2);
u->Set(n3);
u->Set(...);

我知道第二段代码在解释语言中更快,但我觉得在编译语言中没有什么区别。我说得对吗?提前感谢

第二个可能更快,但不会快很多。

它可能更快的原因是,如果编译器不能向自己证明ProgramsManager::CurrentProgram->Uniforms可以通过调用...->Set来更改。如果它不能证明这一点,它将不得不重新评估每行的表达式ProgramsManager::CurrentProgram->Uniforms

然而,现代CPU在这方面通常相当快,编译器也越来越好。

这里有3个选项,而不是2个。

  1. 调用一个单参数函数
  2. 调用一个具有多个参数的函数
  3. 使用容器调用单个函数,如structvector

基本开销

当调用一个函数时,会有指令开销。通常,这涉及到将值放入寄存器或堆栈或其他东西中。

在较低级别,处理器可能不得不重新加载其指令缓存/管线。

优化函数调用

对于优化函数调用,最好的方法是通过粘贴代码(也称为内联)来避免调用。这就消除了开销。

其次是减少函数调用的次数。例如,传递更多的参数将使用更少的函数调用和更少的开销。

多个参数与一个容器

最优函数调用通过寄存器传递值。与可用寄存器相比,额外的参数会导致使用堆栈内存。这意味着函数将需要代码从堆栈内存中检索值。

使用堆栈传递许多参数会产生开销。此外,如果添加或删除更多参数,则需要更改函数签名。

将变量放入容器可以减少开销。只需要传递指向容器的指针(或引用)。这通常只涉及一个寄存器,因为指针通常适合寄存器(许多编译器使用指针通过引用传递结构)。

容器的另一个好处是,容器可以在不必更改函数签名的情况下进行更改。