Подтвердить что ты не робот

Как const после функции оптимизирует программу?

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

void SomeClass::someMethod() const;

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

Edit

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

4b9b3361

Ответ 1

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

Это называется ссылкой на часто задаваемые вопросы в С++ в разделе обсуждение на const_cast.

Ответ 2

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

Ответ 3

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

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

int foo; 
int bar;
double baz;
SomeObject obj;
char ch[14];

Ответ 4

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

Ответ 5

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

Ответ 6

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