В моем понимании lvalue — это просто местоположение, а его соответствующее rvalue — это значение, хранящееся в этом месте. например:
int x;
x = 0; /* the compiler will replace x with the location where 0 will be stored */
int y = x; /* x works as an rvalue here, its content is unknown until run time */
Может ли компилятор знать во время компиляции, что значение x равно 0 в третьей строке, так что он может инициализировать y непосредственно значением 0 (вместо ожидания до времени выполнения, а во время выполнения сначала получить значение x, а затем дать это значение для у)?
int *p = &x;
*p = 3;
Здесь * p во второй строке — lvalue (местоположение x). поскольку &x известен во время компиляции, поэтому * p также известен во время компиляции, верно?
Будет ли компилятор просто заменять * p на местоположение x или он сгенерирует код, который сначала получит адрес, сохраненный в p, а затем назначит 3 этому адресу?
Я не уверен, что вы хотите сделать с lvalues или rvalues. Поправьте меня, если я ошибаюсь, но я чувствую, что вы хотите сделать некоторую «ручную оптимизацию», гарантируя, грубо говоря, что вещи, которые определяются во время компиляции, не требуют каких-либо вычислений во время выполнения. Есть много способов сделать это, некоторые более сложные, чем другие.
Из двух примеров, которые вы опубликовали, я бы посоветовал вам поинтересоваться константными и статическими классификаторами, а также новыми constexpr ключевое слово в C ++ 11. Вообще говоря, никогда не забывайте писать const
когда ты можешь; это действительно помогает компилятору во время оптимизации. За static
это другая история; Оказывается, для всех будет безопаснее, если вы используете его, только если вы уже достаточно опытны в программировании, только в некоторых конкретных случаях, а некоторые из них категорически против его использования …
Если вы хотите узнать немного больше об оптимизации, я бы порекомендовал этот сайт, и, конечно же, есть Шаблон-мета-программирование что может помочь сделать некоторые вычисления во время компиляции.
Если вернуться к вашему примеру, почему вы пишете такую вещь и ожидаете, что компилятор сделает всю работу за вас? Если вы знаете y
0, почему бы не написать это самостоятельно? Если значение y
будет меняться позже, как бы вы поступили иначе, чем выделять место для y
в памяти, и скопировать значение 0 в этом месте, когда ваш код «запускается» с его помощью (во время выполнения, то есть)? Что делать, если значение y
был установлен в зависимости от условия, которое может быть разрешено только во время выполнения? И т.п.
Оптимизация действительно захватывающая, правда, но она не должна стоять на первом месте в разработке. Если вы что-то запрограммировали и думаете, что оно может работать быстрее, спросите себя, как, но в большинстве случаев бесполезно (и опасно, и неэффективно) пытаться оптимизировать каждую инструкцию.
«Во имя эффективности (без необходимости ее достижения) совершается больше вычислительных грехов, чем по любой другой единственной причине — включая слепую глупость.«W.A. Wulf
Я бы не сказал, что в выражении int y = x
переменная x
это R-значение. Тот факт, что он находится справа, не означает, что это r-значение.
По определению, l-значение объект, который занимает определенное место в памяти, такие как x
; R-значения просто объекты, которые не являются l-значениями.
Так что, если выражение было int y = x1 + x2
тогда да, временный x1 + x2
будет R-значение, но в вашем случае, и для времени жизни области, в которой x
определено, x
имеет идентифицируемое местоположение в памяти и, таким образом, является l-значением.