是否可以想象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)
编译器可以优化它来直接访问成员并设置它吗?
是的,它被称为内联.
此外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.
| 归档时间: |
|
| 查看次数: |
1738 次 |
| 最近记录: |