Я не уверен, что вы хотите иметь отношение к lvalues или rvalues. Исправьте меня, если я ошибаюсь, но я чувствую, что вы хотите сделать некоторые «ручные оптимизации», гарантируя, грубо говоря, что вещи, которые определены во время компиляции, не принимают никаких вычислений во время выполнения. Есть много способов сделать это, некоторые более сложные, чем другие.
Из двух приведенных вами примеров я бы посоветовал вам проявить интерес к константным и статическим классификаторам и новому ключевому слову constexpr в C++ 11. Вообще говоря, никогда не забывайте писать const
, когда можете; это действительно помогает компилятору во время оптимизации. Для static
это еще одна история; он оказывается более безопасным для всех, если вы используете его только в том случае, если вы уже достаточно опытны в программировании, только в некоторых конкретных случаях, а некоторые из них религиозно не используют его вообще ...
Если вы хотите немного узнать подробнее об оптимизации, я бы порекомендовал this website, и, конечно же, есть template-meta-programming, что может помочь сделать некоторые вычисления во время компиляции.
Чтобы вернуться к вашему примеру, зачем вы пишете такую вещь и ожидаете, что компилятор выполнит эту работу за вас? Если вы знаете y
0, почему бы не написать его самостоятельно? Если значение y
изменится позже, как бы вы сделали иначе, чем выделить пространство для y
в памяти и скопировать значение 0 в этом месте, когда ваш код «начнет» с его помощью (т.е. во время выполнения)? Что делать, если значение y
было установлено в зависимости от состояния, которое может быть разрешено только во время выполнения? И т. Д.
Оптимизация действительно захватывающая, правда, но она не должна быть первой в разработке.Если вы что-то запрограммировали и считаете, что он может работать быстрее, тогда спросите себя, как, но большую часть времени это бесполезно (и опасно, и неэффективно), чтобы попытаться оптимизировать каждую инструкцию.
«Другие грехи вычислительными совершаются во имя эффективности (не обязательно его достижения), чем какой-либо другой причине. - в том числе слепой глупости», W.A. Вульф
Посмотрите на сборку производства. – chris
В обоих случаях компилятор, скорее всего, просто выкинет как можно больше ненужного промежуточного мусора и значительно сварит код. В первом случае, если 'x' не используется в другом месте, я был бы удивлен, если бы он был * в * конечных бит. Аналогично с 'p' во втором. Подумайте об этом, а затем просмотрите комментарий Криса. – WhozCraig
Он может выполнять эту оптимизацию, но он не имеет ничего общего с категориями значений выражений. Что заставляет вас думать, что местоположение объекта всегда известно во время компиляции? –