Определены ли значения во время компиляции?

В моем понимании 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 этому адресу?

0

Решение

Я не уверен, что вы хотите сделать с lvalues ​​или rvalues. Поправьте меня, если я ошибаюсь, но я чувствую, что вы хотите сделать некоторую «ручную оптимизацию», гарантируя, грубо говоря, что вещи, которые определяются во время компиляции, не требуют каких-либо вычислений во время выполнения. Есть много способов сделать это, некоторые более сложные, чем другие.

Из двух примеров, которые вы опубликовали, я бы посоветовал вам поинтересоваться константными и статическими классификаторами, а также новыми constexpr ключевое слово в C ++ 11. Вообще говоря, никогда не забывайте писать const когда ты можешь; это действительно помогает компилятору во время оптимизации. За static это другая история; Оказывается, для всех будет безопаснее, если вы используете его, только если вы уже достаточно опытны в программировании, только в некоторых конкретных случаях, а некоторые из них категорически против его использования …

Если вы хотите узнать немного больше об оптимизации, я бы порекомендовал этот сайт, и, конечно же, есть Шаблон-мета-программирование что может помочь сделать некоторые вычисления во время компиляции.

Если вернуться к вашему примеру, почему вы пишете такую ​​вещь и ожидаете, что компилятор сделает всю работу за вас? Если вы знаете y 0, почему бы не написать это самостоятельно? Если значение y будет меняться позже, как бы вы поступили иначе, чем выделять место для y в памяти, и скопировать значение 0 в этом месте, когда ваш код «запускается» с его помощью (во время выполнения, то есть)? Что делать, если значение y был установлен в зависимости от условия, которое может быть разрешено только во время выполнения? И т.п.

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

«Во имя эффективности (без необходимости ее достижения) совершается больше вычислительных грехов, чем по любой другой единственной причине — включая слепую глупость.«W.A. Wulf

2

Другие решения

Я бы не сказал, что в выражении int y = x переменная x это R-значение. Тот факт, что он находится справа, не означает, что это r-значение.

По определению, l-значение объект, который занимает определенное место в памяти, такие как x; R-значения просто объекты, которые не являются l-значениями.

Так что, если выражение было int y = x1 + x2тогда да, временный x1 + x2 будет R-значение, но в вашем случае, и для времени жизни области, в которой x определено, x имеет идентифицируемое местоположение в памяти и, таким образом, является l-значением.

-2

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector