用c++更快地调用方法
Faster way to call a method in c++
快速提问,如果听起来很天真,我深表歉意。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个。
- 调用一个单参数函数
- 调用一个具有多个参数的函数
- 使用容器调用单个函数,如
struct
或vector
基本开销
当调用一个函数时,会有指令开销。通常,这涉及到将值放入寄存器或堆栈或其他东西中。
在较低级别,处理器可能不得不重新加载其指令缓存/管线。
优化函数调用
对于优化函数调用,最好的方法是通过粘贴代码(也称为内联)来避免调用。这就消除了开销。
其次是减少函数调用的次数。例如,传递更多的参数将使用更少的函数调用和更少的开销。
多个参数与一个容器
最优函数调用通过寄存器传递值。与可用寄存器相比,额外的参数会导致使用堆栈内存。这意味着函数将需要代码从堆栈内存中检索值。
使用堆栈传递许多参数会产生开销。此外,如果添加或删除更多参数,则需要更改函数签名。
将变量放入容器可以减少开销。只需要传递指向容器的指针(或引用)。这通常只涉及一个寄存器,因为指针通常适合寄存器(许多编译器使用指针通过引用传递结构)。
容器的另一个好处是,容器可以在不必更改函数签名的情况下进行更改。
相关文章:
- 在c++中多次调用方法
- 如何确保在使用基于布尔值的两个方法之一调用方法时避免分支预测错误
- 接收字符串并使用它来调用方法C++
- 使用 gmock c++ 在真实对象上调用方法
- 不带预处理器的调用方法/文件的文件名/行号
- JNI从Android调用C++方法
- 在 C++ 的 Switch Case 中创建对象后对对象调用方法
- 如何使用接口指针调用方法,该指针是其具体类的一部分,而不是接口的一部分
- 从内部类中的方法从包含类调用方法
- 在销毁期间从另一个线程调用对象上调用方法是否未定义行为?
- 为什么派生类的实例从基类调用方法?
- 实例化对象并调用方法,使用单行语法在 C# 或 C++ 中返回值?
- C++当您取消引用指向类对象的指针,然后将其作为引用返回时,是否可以对此引用调用方法
- 通过模板函数对未知类型调用方法
- 从基于迭代器的for循环转换后,如何在map::find()中调用方法
- 创建一个C++DLL以从C#DLL调用方法
- 如何从qt中的类中调用方法
- 如何在不迭代的情况下对数组中的每个元素调用方法
- C++11 - 获取编译时的所有类变量,并在没有 Boost 的情况下为它们调用方法
- C ++:如何在不创建对象的情况下在主函数中调用方法