优化远离函数调用

chb*_*er0 6 c++ optimization

是否可以想象C++编译器会优化对只设置类变量的类成员函数的函数调用?例:

class A
{
    private:
        int foo;
    public:
        void bar(int foo_in)
        {
             foo = foo_in;
        }
}
Run Code Online (Sandbox Code Playgroud)

所以,如果我这样做

A test;
A.bar(5);
Run Code Online (Sandbox Code Playgroud)

编译器可以优化它来直接访问成员并设置它吗?

luk*_*k32 7

是的,它被称为内联.

此外c++,它专门用于支持或使编译器更容易执行,在相当复杂的继承案例和模板中进行此类优化.

有人会说,c++与其他语言相比,这是一种非常独特的高级语言.它的"高级"功能(主要是指通用编程 - 模板)在设计时考虑了这种优化.这也是使其在性能方面被认为是有效的原因之一.

这也是为什么我期望在inline使用任何声誉良好的编译器进行编程时能够做得不错的工作.

从我读过的内容来看,这也是为什么难以获得其他高级语言的所有奇特内容的原因,例如Reflection机制,或者其他已知的例如Java或python.因为它被c++设计为可以轻松地允许内联几乎所有可能的内容,因此很难内省优化的代码.

编辑:

因为你说你正在写一个OpenGL的东西,其中setter和getter的性能和这样的优化很重要,我决定详细说明并展示一些更有趣的例子,你可以依赖内联机制.

您可以编写一些避免使用virtual机制但使用模板的接口.例如:

//This is a stripped down interface for matrices for physical objects
//that have Hamiltonian and you can apply external field and temperature to it
template< class Object >
class Iface {
protected:  
    Object& t;

public:
  Iface(Object& obj) : t(obj) {};

  Vector get_eigen_vals() {return t.get_eigen_vals(); };
  Matrix get_eigen_vectors() {return t.get_eigen_vectors(); };

  void set_H(VectorD vect) { t.set_H(vect); };
  void set_temp(double temp)   {t.set_temp(temp);};
};
Run Code Online (Sandbox Code Playgroud)

如果您声明这样的接口,您可以使用此接口对象包装一个对象,并将此接口类的实例传递给您的函数/算法,并且仍然内联所有内容,因为它适用于引用Object.好的编译器可以优化整体Iface.