C++ 在c++;

C++ 在c++;,c++,C++,问个简单的问题,如果听起来很幼稚,我道歉。 什么是更快的C++。这样的代码: ProgramsManager::CurrentProgram->Uniforms->Set(n1); ProgramsManager::CurrentProgram->Uniforms->Set(n2); ProgramsManager::CurrentProgram->Uniforms->Set(n3); ProgramsManager::CurrentProgram->U

问个简单的问题,如果听起来很幼稚,我道歉。 什么是更快的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
  • 基本间接费用 调用函数时会有指令开销。通常这涉及到将值放在寄存器或堆栈或其他地方

    较低级别,处理器可能必须重新加载其指令缓存/管道

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

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

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

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

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


    容器的另一个好处是,容器可以更改,而无需更改函数签名

    你说得对。任何像样的编译器都会为这两个对象生成相同的目标代码。@Dúthomhas编译器只会为这两个对象创建相同的代码,前提是它可以确保
    Set
    不会更改
    ProgramsManager::CurrentProgram
    Uniforms
    底线是对其进行分析,请参见。我知道这种显式缓存可以提供好处。要知道编译器将优化什么或不优化什么并不总是容易的,事实是在汇编语言中。优化设置将影响发出的汇编语言指令。打印并比较两者的汇编语言。还可以尝试使用不同的优化设置。@Galik虽然我没有发现缓存函数指针是有用的,但我发现缓存int值(比如int I=val->x->pos;)可以提供可测量的好处。这取决于传递了多少变量,以及有多少寄存器可用于传递变量。