Несколько способов получения адреса

В руководстве по компилятору IAR C/C++ говорится о написании исходного кода, удобного для оптимизации:

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

Какие еще существуют способы получения адреса локальной переменной? Очевидно, я знаю, что если бы у меня был указатель на эту переменную, я мог бы использовать ее, а если бы у меня был массив, я мог бы использовать имя массива, однако я не знаю никаких других методов получения адреса локальной переменной, кроме & оператор.


person Jeremy    schedule 18.10.2012    source источник


Ответы (1)


Других способов взять адрес [*] нет. Текст «с использованием оператора &» в этом совете лишний. Я полагаю, это просто для того, чтобы напомнить вам, какой оператор является оператором адреса, если вы не поняли, чего следует избегать.

Оптимизации, о которых идет речь, следующие:

1) если не брать адрес, то переменной не нужно иметь адрес.

2) если адрес никогда не «ускользает» от кода, который может видеть компилятор, то компилятор может предположить, что значение не изменяется с помощью кода, который он не может видеть. Это гарантирует отсутствие взятия адреса, но в некоторых случаях компиляторы могут выполнять анализ обхода, даже если адрес занят.

На самом деле для любой из этих целей не имеет значения, как берется адрес, поэтому, если бы был существовал другой способ взять адрес в C, то совет должен был бы упомянуть его вместе с оператором &.

[*] [Редактировать: ага! Я немного ошибаюсь. Если переменная представляет собой массив, вы можете взять ее адрес без использования оператора &, просто позвольте ему превратиться в указатель на первый элемент. Я не знаю, действительно ли компилятор IAR оптимизирует достаточно маленькие массивы в регистры, если нет, то нет необходимости упоминать об этом. Но это, безусловно, разрешено.]

person Steve Jessop    schedule 18.10.2012