(отчасти вдохновленный этим ответом, хотя и не связанным)
Мне всегда говорили (и я говорил), что сохранение const
-правильности даже для недолговечных переменных является ценным и хорошей практикой, например:
const std::string a = "Hello world";
Вместо
std::string a = "Hello world";
Этот:
- Более четко выражает намерение.
- Убедиться, что переменная неизменяема, поэтому передача ее какой-либо функции, которая может ее изменить, заставит компилятор кричать на вас.
- Может повысить производительность благодаря оптимизации компилятора.
Хотя с тех пор, как в современном C++ появилось исключение копирования, в стандарте появилось несколько предложений., которые позволяют компилятору вызывать конструктор перемещения вместо конструктора копирования:
В следующих контекстах инициализации копирования вместо операции копирования может использоваться операция перемещения:
(3.1) Если выражение в операторе
return
([stmt.return]) является (возможно, заключенным в скобки) id-выражением, которое называет объект с длительностью автоматического хранения, объявленной в теле или объявлении параметра- предложение самой внутренней объемлющей функции или лямбда-выражения, или(3.2) если операндом
throw-expression
([expr.throw]) является имя энергонезависимого автоматического объекта (кроме функции или параметра оператора catch), область действия которого не выходит за пределы конец самой внутренней охватывающейtry-block
(если она есть),
Означает ли это, что на самом деле может быть потеря производительности при использовании объектов const
с конструктором копирования/перемещения, отличным от используемого по умолчанию, вместо повышения производительности при столкновении с ситуациями, к которым может применяться такое исключение?
const
. (Я думаю, что это было до C ++ 11 раз). В настоящее время это может быть не так, поскольку оптимизаторы так хорошо выясняют, изменены ли данные вообще, так что, возможно, это уже не так, и это просто древняя реликвия. . (например, использованиеinline
для повышения производительности). - person Hatted Rooster   schedule 12.03.2019const
, когда они не должны были), нестандартная реализация (та же самая) или пропущенная оптимизация ( т. е. не оптимизировать оба случая одинаково). - person Acorn   schedule 12.03.2019const
действительно может улучшить производительность:extern const
достаточно простой объект (например,int
) с инициализатором, потому что даже без внутренней компоновки компилятор может использовать тот факт, что стандарт говорит, что значение не разрешено сдача. - person Acorn   schedule 12.03.2019constexpr
, а не толькоconst
, поэтому можно сказать, что единственное преимуществоconst
заключается в тех случаях, когда вместо них может применяться (и должно быть)constexpr
. - person Acorn   schedule 12.03.2019const
переменные в данной области не может измениться. - person Max Langhof   schedule 12.03.2019const
, он может иметь, например,mutable
членов. Кроме того, следите за неоригинальнымиconst
объектами, потому что они также не дают никаких гарантий. Даже если в нем нетmutable
членов и изначальноconst
, выполнение быстрого теста выглядит так, будто оптимизаторы не предполагают, что оно не изменилось. Даже если бы они это сделали, в целом было бы плохой идеей полагаться наconst
для производительности. Предположим, что вы не получаете никаких преимуществ, и если вы знаете, что объект не меняется, спроектируйте код, чтобы использовать это другим способом. - person Acorn   schedule 12.03.2019test2()
доfoo(bar()); return true;
? Я могу понять, если у них нет проходов оптимизатора для этого (потому что это обычно бесполезно), ноtest2()
никогда не сможет вернутьfalse
, не так ли? Позвольте мне задать это как вопрос на самом деле ... - person Max Langhof   schedule 12.03.2019it may still have mutable members
Оптимизацию, которую я предлагаю, нельзя использовать для изменяемых элементов. Но не все члены изменяемы. На самом деле изменяемые члены почти никогда не используются. Конечно, если все ваши члены изменяемы, то я согласен, что использование константных экземпляров этого класса действительно было бы бессмысленным.doing a quick test looks like optimizers do not assume it hasn't changed
Пример Макса демонстрирует, как именно это делает оптимизатор (вместо неконстантного указателя используется константная ссылка; это различие не имеет значения). - person eerorika   schedule 12.03.2019constexpr
для начала, что в этом случае вы не можете из-заbar()
. - person Acorn   schedule 12.03.2019constexpr
... - person Max Langhof   schedule 12.03.2019const
, который вы передаете, имеет один членmutable
или член сmutable
членами, то следует предположить, что они могли измениться, а это, в свою очередь, может означать, что другие методы ведут себя иначе. Что касается примера Макса, то здесь все по-другому: его случай был тривиальным, когда переменные фактически обрабатывались какconstexpr
. Если вы попытаетесь сделать то же самое с очень простым объектом типа класса, то оптимизации тоже не произойдет (я могу только заставить clang сделать это, если это POD и я обращаюсь к переменной напрямую, без геттера). - person Acorn   schedule 12.03.2019const
. - person Acorn   schedule 12.03.2019