разбирать, разбирать, разбирать ...
В зависимости от того, какие строки кода вы нам не показываете, возможно, что если ваш указатель несколько статичен, хороший компилятор узнает об этом и предварительно вычислит адрес для обоих. Если у вас нет оптимизаций, тогда вся эта дискуссия нема. Это также зависит от процессора, который вы используете, оба могут быть выполнены с одной инструкцией в зависимости от процессора. Поэтому я следую основным шагам оптимизации:
1) разобрать и осмотреть
2) время исполнения
Как упомянуто выше, хотя суть в том, что это может быть случай двух инструкций вместо одной, которая стоит одного такта, который вы, вероятно, никогда не увидите. Качество вашего выбора компилятора и оптимизатора может привести к гораздо более значительным различиям в производительности, чем попытка изменить одну строку кода в надежде повысить производительность. Переключение компиляторов может дать вам 10-20% в любом направлении, иногда больше. Как и изменение флагов оптимизации, включение всего, что не делает код быстрее, иногда -O1 работает лучше, чем -O3.
Понимание того, что производят эти две строки кода и как максимизировать производительность на языке высокого уровня, приходит из компиляции для разных процессоров и дизассемблирования с использованием различных компиляторов. И что еще более важно, код вокруг рассматриваемых строк играет большую роль в том, как компилятор оптимизирует этот сегмент.
Используя чужой пример по этому вопросу:
typedef struct
{
unsigned int first;
unsigned int second;
} dataStruct;
dataStruct data;
int main()
{
dataStruct *pData = &data;
data.first = 9;
pData->second = 10;
return(0);
}
С gcc (не таким уж и хорошим компилятором) вы получите:
mov r2, #10
mov r1, #9
stmia r3, {r1, r2}
Таким образом, обе строки кода C объединены в одном хранилище, проблема здесь в том, что пример используется в качестве теста. Две отдельные функции были бы немного лучше, но для этого нужно гораздо больше кода вокруг, а указатель должен указывать на какую-то другую память, поэтому оптимизатор не понимает, что это статический глобальный адрес, чтобы проверить это, необходимо передать адрес поэтому компилятор (хорошо gcc) не может понять, что это статический адрес.
Или без оптимизации, тот же код, тот же компилятор, без разницы между указателем и прямым.
mov r3, #9
str r3, [r2, #0]
mov r3, #10
str r3, [r2, #4]
Это то, что вы ожидаете увидеть в зависимости от компилятора и процессора, может быть никакой разницы. Для этого процессора, даже если тестовый код скрывает статический адрес указателя от функции, он все равно сводится к двум инструкциям. Если значение, хранящееся в элементе структуры, уже загружено в регистр, то это будет одна инструкция в любом направлении, указатель или прямая.
Так что ответ на ваш вопрос не является абсолютным ... это зависит. разобрать и проверить.