c++ - 优化函数调用

标签 c++ optimization

是否可以想象 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/

相关文章:

c++ - std::sort 自定义比较器

java - 优化 - 将整数数组输出到 std 输出的最有效方法,在 Java 中用换行符分隔

c++ - 是否应该评估或存储循环限制?

c++ - 使用 C++ .Net MySQL 连接器的参数化查询不返回任何结果

c++ - 在模板类之外定义运算符重载

c++ - 基数排序 C++ 赋值

c++ - 如何在 Linux 上使用带有 EG20T 芯片组的英特尔凌动 Q7 模块上的 CAN 总线?

Java 方法从数组列表返回

c - 定义的值比硬编码的数字慢

r - lme4 glmer 中的缩放预测变量不会解决特征值警告;替代优化也没有