C++ 试图避免函数调用中的参数开销

C++ 试图避免函数调用中的参数开销,c++,function,parameter-passing,C++,Function,Parameter Passing,在我正在编写的一个性能关键型应用程序中,有一次我总是使用相同的参数在紧循环中重复调用同一函数数百万次。我决定通过将参数放入类中来避免参数传递的开销。例如,在: some_class p1; some_class p2; some_class p3; for (int count = 12345678; count; --count) foo(p1,p2,p3); 之后: class foo // Ignoring private / public for brevity

在我正在编写的一个性能关键型应用程序中,有一次我总是使用相同的参数在紧循环中重复调用同一函数数百万次。我决定通过将参数放入类中来避免参数传递的开销。例如,在:

some_class p1;
some_class p2;
some_class p3;
for (int count = 12345678; count; --count)
    foo(p1,p2,p3);
之后:

class foo         // Ignoring private / public for brevity
{
    some_class& p1_;
    some_class& p2_;
    some_class& p3_;

    foo(some_class& p1, some_class& p2, some_class& p3)
    : p1_(p1), p2_(p2), p3_(p3_)
    {}

    void execute();
 }

some_class p1;
some_class p2;
some_class p3;
foo f(p1,p2,p3);
for (int count = 12345678; count; --count)
    f.execute();
我的分析结果是:前=11121毫秒,后=11416毫秒

我本来希望性能有所提高,因为我避免了在堆栈上推送参数地址,但却得到了轻微的降级


为什么会这样?我使用Visual C++ 2008 Express版,但我认为可能有一个平台不可知的答案。

< P>完全避免重述函数,创建一些<代码> ExcUTETyLoad(SoopyCopy&P1,SoopyPoopy&P2,SoothPosie&P3,const int迭代)< /C>(迭代次数作为额外参数)并将循环移动到函数内部


一些额外的推理(从第一个优化级别开始,所有推理都可能由编译器自动完成,但是嘿):

  • 在你的策略中,用较少的论据来交换的缺点是对类成员的尊重。您的里程可能会有所不同

  • 如果没有在函数内部修改参数,请在函数签名中将它们声明为
    const
    ,这向编译器表明函数可以在不重新读取参数的情况下再次运行


  • 如果您多次调用它,为什么不直接内联它(使用
    inline
    关键字或手动)?现在的编译器并不笨:)您的编译器可能在这两种情况下都内联了函数,认为传递参数时可以节省。您的函数必须是,为了推动三个
    int
    参数来降低总体计时,这一点非常小。@dasblinkenlight所以我认为通过创建一个类来保存这些参数,OP阻止了内联,这反过来又降低了性能。@chrislaplate差异在3%以下,因此,这可能仅仅是OP的微观基准中的一个统计错误(这些标准是出了名的不精确)。