Как const после функции оптимизирует программу? - PullRequest
18 голосов
/ 01 мая 2009

Я видел несколько таких методов:

void SomeClass::someMethod() const;

Что делает это объявление const и как оно может помочь оптимизировать программу?

Редактировать

Я вижу, что первая часть этого вопроса была задана ранее ... НО , он все еще не отвечает на вторую часть: как это оптимизирует программу?

Ответы [ 6 ]

19 голосов
/ 01 мая 2009

Если компилятор знает, что поля экземпляра класса не изменяются при вызове функции-члена const, ему не нужно перезагружать поля, которые он мог хранить в регистрах, перед вызовом функции const.

Это как бы упоминается в C ++ FAQ в обсуждении const_cast .

5 голосов
/ 01 мая 2009

Сообщает компилятору, что метод не влияет на состояние классов; Вы не можете назначить что-либо в этом. Взгляните на C ++ FAQ Lite 18.10 .

4 голосов
/ 01 мая 2009

Код asm, сгенерированный для метода const, будет таким же, если есть const или нет. const является функцией компилятора, а не среды выполнения, поэтому, если есть какой-либо выигрыш в производительности, я думаю, что оптимизатор компиляторов может использовать const в качестве подсказки для таких вещей, как включение или определение побочных эффектов для возможной оптимизации. Короче говоря, оптимизатор может немного помочь, но если метод прост для начала, то я сомневаюсь, что код, сгенерированный из оптимизатора, будет каким-то другим const или не const.

Вот простая оптимизация, которую я использую (вместо того, чтобы упустить и пропустить такие вещи, как const), которая занимает секунду, но окупается. Организуйте свои переменные класса так, чтобы они немного лучше попадали на границы строк кэша, и соберите вместе наиболее часто используемые переменные. Для этого просто поместите ваши int, double, float и т. Д. Вместе в верхней части объявлений переменных вашего класса и ваших переменных нечетного размера в нижней части, например:

int foo; 
int bar;
double baz;
SomeObject obj;
char ch[14];
2 голосов
/ 01 мая 2009

Позволяет вызывать функцию-член класса для 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 для использования с volatile объектами, и вы также можете сделать функции const volatile для использования на const volatile объектах, но эти два чрезвычайно редки.

1 голос
/ 01 мая 2009

Он не позволяет someMethod изменять любую переменную-член объекта этого класса.

0 голосов
/ 01 мая 2009

Моя первая мысль относительно оптимизации заключается в том, что, поскольку const указывает, что состояние экземпляра не изменилось, компилятор, возможно, имеет больше свободы в отношении изменения порядка вызовов методов в этом экземпляре.

...