【问题标题】:Calling inline functions C++调用内联函数 C++
【发布时间】:2010-11-06 08:28:37
【问题描述】:

我在 MyClass 类下定义了一个内联成员函数

int MyClass::myInlineFunction();

这个函数是从我的代码中的几个地方调用的。
调用此函数有两种方式
案例1:每次调用函数时都使用this。

mobj->myInlineFunction() ;

案例2:将此函数的结果赋值给一个变量,并用于后续访问

var = mobj->myInlineFunction() ;

应该首选哪一个??

【问题讨论】:

    标签: c++ inline-method


    【解决方案1】:

    即使性能不是问题,我也会使用案例 2。如果您只关心这个函数的结果,那么将其分配给一个变量可以让您稍后轻松切换到另一种获取此结果的方法。

    【讨论】:

      【解决方案2】:

      在不知道什么或位置的情况下进行优化通常会导致更复杂的代码,而不是比原始代码快。

      对我来说,确定使用哪种解决方案的标准并非基于您提供的信息。

      • 如果方法是访问器(只返回一个内部值,如在 std::vector::size() 中),则使其内联并且不缓存结果。
      • 如果该方法确实执行了重要工作,请不要将其设为内联并测量(您无法测量内联方法)它被调用的次数,它所代表的成本。然后决定缓存或内联是否合适。
      • 缓存结果(您的情况 2)可能是对昂贵方法的改进,但前提是该值保证不会在使用之间发生变化,在这种情况下,我不会将方法内联。
      • 如果如果对您的算法产生负面影响,您必须缓存结果(根据结果创建内存,然后使用该内存检查溢出的相同结果,如果值更改,您将溢出缓冲区)

      【讨论】:

        【解决方案3】:

        不幸的是,没有一个简单的答案,这取决于功能。

        如果函数是微不足道的,像 { return 6; },每次都调用它。编译器将内联调用并删除代码。您应该发现将其分配给变量之间没有区别。

        如果函数更复杂,则可能值得将其分配给变量。整个程序中的值是否恒定?那么也许可以在类中添加一个包含该值的静态成员?

        【讨论】:

          【解决方案4】:

          据我所知,我无法理解内联函数和将其分配给函数指针之间的关系。

          但可以肯定的是,第一种方法是自我记录。

          编辑:: 谢谢艾哈迈德,

          这取决于实际情况,不能总是用另一种方式代替。

          同样,如果两者都有效,至少第一种方法对我来说更清楚。

          【讨论】:

          • 他分配函数的结果(返回值)而不是函数本身
          【解决方案5】:

          如果函数每次调用都返回相同的结果,则必须使用 case 2,因为使用 case 1 没有意义,即使它是内联函数

          【讨论】:

            【解决方案6】:

            关于是否保留返回值或再次调用函数的决定不应基于函数是否内联 - 因为这是一个实现细节,可能会随着类的生命周期/演变而改变.根据经验,如果它不会使代码过于复杂,我将始终坚持返回值,因为您不知道作为一个类的用户,函数的成本是多少 - 今天便宜的可能是明天贵。所以我会选择案例 2。

            【讨论】:

            • “今天便宜的东西明天可能会很贵”。没错,虽然更多时候情况正好相反。
            【解决方案7】:

            如果函数执行需要一些时间的操作,案例 2 可以为您提供很多性能。 选择它如果

            • 您不需要发生函数的副作用
            • 该函数将始终在该上下文中返回相同的结果

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2017-01-05
              • 1970-01-01
              • 1970-01-01
              • 2011-08-23
              • 1970-01-01
              相关资源
              最近更新 更多