可以想象C ++编译器会优化对只设置类变量的类成员函数的函数调用吗?例如:
class A
{
private:
int foo;
public:
void bar(int foo_in)
{
foo = foo_in;
}
}
所以,如果我这样做了
A test;
A.bar(5);
编译器可以优化它来直接访问成员并设置它吗?
答案 0 :(得分:7)
是的,它被称为内联。
此外,c++
专门用于支持或使编译器更容易执行,在相当复杂的继承案例和模板中执行此类优化。
有些人会说c++
与其他语言相比,这是一种非常独特的高级语言。它的“高级”功能(主要是指通用编程 - 模板)在设计时考虑了这种优化。这也是使其在性能方面被认为是有效的原因之一。
这也是为什么我希望用任何有信誉的编译器来完成inline
的合理工作。
从我读过的内容来看,这也是为什么难以获得其他高级语言的所有花哨内容的原因,例如反射机制,或其他已知的。 Java或python。这是因为c++
旨在轻松地允许内联几乎所有可能的内容,因此很难内省优化的代码。
修改强>
因为你说你正在写一个OpenGL的东西,其中setter和getter的性能以及这样的优化都很重要我决定详细说明并展示一些更有趣的例子,你可以依赖内联机制。
您可以编写一些避免virtual
机制但使用模板的接口。 E.g:
//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);};
};
如果您声明这样的接口,您可以使用此接口对象包装对象,并将此接口类的实例传递给您的函数/算法,并且仍然内联所有内容,因为它适用于Object
的引用。好的编译器可以优化整个Iface
。
答案 1 :(得分:1)
要回答这个问题,而不仅仅是内联:
标准中有一些称为as-if规则的东西。它表示允许编译器对程序进行任何更改,只要它不影响可观察的行为即可。甚至有一些豁免允许他们改变技术上确实会改变可观察行为的事物。
它可以省略函数调用甚至完成类。只要不破坏任何东西,它基本上可以做任何事情。
答案 2 :(得分:0)
是的,编译器可以优化此调用。 这实际上是非常简单的内联案例。 允许编译器执行更多操作(它可以展开循环,优化局部变量,用常量替换计算等)。