代码之家  ›  专栏  ›  技术社区  ›  Unknown

函数后常量是如何优化程序的?

  •  18
  • Unknown  · 技术社区  · 16 年前

    我见过这样的方法:

    void SomeClass::someMethod() const;
    

    这个const声明做什么,它如何帮助优化程序?

    编辑

    我看到这个问题的第一部分已经被问过了… 但是 它仍然没有回答第二部分:这将如何优化程序?

    6 回复  |  直到 8 年前
        1
  •  19
  •   Jim Buck    16 年前

    如果编译器知道类实例的字段没有在const成员函数调用中被修改,那么它不必在const函数调用之前重新加载它可能保存在寄存器中的任何字段。

    这是指在C++中的FAQ中的 discussion on const_cast .

        2
  •  5
  •   Charlie Martin    16 年前

    它告诉编译器该方法对类状态没有影响;您不能为其中的任何内容赋值。看看 C++ FAQ Lite 18.10 .

        3
  •  4
  •   Aaron Cook    16 年前

    如果const存在或不存在,则为const方法生成的asm代码将相同。const是编译器的一个函数,而不是运行时的函数,因此如果有任何性能提升,我认为编译器优化器可能会使用const作为提示,以进行内联或确定可能的优化的副作用。所以简而言之,优化器可能会帮上一点忙,但是如果方法是直接开始的话,那么我怀疑优化器生成的代码是否是任何不同的常量。

    这是我使用的一个简单的优化(而不是像const这样的轻而易举的优化),它需要一秒钟的时间,但会有回报。组织类变量,使它们更好地落在缓存线边界上,并将访问最多的变量放在一起。为此,只需将int、double、float等放在类变量声明的顶部,并将奇数大小的变量放在底部,如下所示:

    int foo; 
    int bar;
    double baz;
    SomeObject obj;
    char ch[14];
    
        4
  •  2
  •   Adam Rosenfield    16 年前

    它允许您调用类成员函数 const 物体:

    class SomeClass
    {
    public:
        void foo();
        void bar() const;
    }
    
    SomeClass a;
    const SomeClass b;
    
    a.foo();  // ok
    a.bar();  // ok
    b.foo();  // ERROR -- foo() is not const
    b.bar();  // ok -- bar() is const
    

    还有 volatile 用于的限定符 不稳定的 对象,也可以使函数 const volatile 用于使用 常量挥发 但这两个物体是非常罕见的。

        5
  •  1
  •   Myforwik    16 年前

    它防止某些方法更改该类对象的任何成员变量。

        6
  •  0
  •   imaginaryboy    16 年前

    关于优化,我的第一个想法是,由于“const”表示实例的状态没有改变,因此编译器可能有更多的自由来重新排序对该实例上方法的附近调用。