是否可以想象 C++ 编译器会优化对仅设置类变量的类成员函数的函数调用?示例:
class A
{
private:
int foo;
public:
void bar(int foo_in)
{
foo = foo_in;
}
}
如果我这样做
A test;
A.bar(5);
编译器可以优化它以直接访问成员并像这样设置它吗?
最佳答案
是的,这叫做内联。
此外,c++
专门设计用于在非常复杂的继承情况和模板中支持或使编译器更容易执行此类优化。
有人会说,与其他语言相比,c++
作为一种高级语言,这是非常独特的壮举。它的“高级”功能(我指的主要是通用编程 - 模板)在设计时就考虑到了这种优化。这也是使其在性能方面被认为高效的原因之一。
这也是为什么我期望在使用任何信誉良好的编译器编写 inline
方面有一份体面的工作。
根据我的阅读,这也是为什么很难获得其他高级语言的所有花哨的东西的原因,例如反射机制,或其他已知的东西,例如Java 或 python 。这是因为 c++
旨在轻松允许内联几乎所有可能的内容,因此很难自省(introspection)优化代码。
编辑:
因为您说您正在编写 OpenGL 的东西,其中 setter 和 getter 的性能以及此类优化很重要,所以我决定详细说明并展示一个更有趣的示例,您可以在其中依赖内联机制。
您可以编写一些接口(interface)来避免使用虚拟
机制,而是使用模板。例如:
//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);};
};
如果你像这样声明接口(interface),你可以用这个接口(interface)对象包装一个对象,并将这个接口(interface)类的实例传递给你的函数/算法,并且仍然内联所有内容,因为它在 Object< 的引用上工作
。好的编译器会优化整个 Iface
。
关于c++ - 优化函数调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20382429/