Как const после функции оптимизирует программу?
Я видел несколько таких способов:
void SomeClass::someMethod() const;
Что делает это объявление const, и как это может помочь оптимизировать программу?
Edit
Я вижу, что первая часть этого вопроса задана раньше... НО, он все равно не отвечает на вторую часть: как это будет оптимизировать программу?
Ответы
Ответ 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" указывает, что состояние экземпляра не изменилось, компилятор, возможно, имеет больше свободы в отношении переупорядочения соседних вызовов методам в этом экземпляре.