Будут ли эти два метода доступа к массиву реализованы одинаково или нет? - PullRequest
1 голос
/ 17 ноября 2010

У нас есть трехбайтовый массив, как показано ниже:

char charArray[3];
charArray[1]='a';
//or
char * charP=charArray;
charP[1]='a';

Два метода используются для доступа ко второму элементу массива, теперь они будут реализованы таким же образом компилятором, или первый метод будетне задействовать указатель как второй метод?

Ответы [ 4 ]

4 голосов
/ 17 ноября 2010

будут ли они реализованы таким же образом компилятором

Может быть.

Если вы используете имя массива, а нижний индекс является константным выражением, компилятор, вероятно, может выполнить некоторую или всю арифметику указателя во время компиляции. Возможно, он не сможет сделать то же самое, используя указатель на массив; это, вероятно, зависит от того, может ли компилятор точно сказать, что указатель указывает на элемент в массиве.

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

1 голос
/ 17 ноября 2010

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

с charP, это значение l, и вы можете переместить его, чтобы он указывал на другое местоположениеи вы можете увеличить его с помощью ++ и т. д.

1 голос
/ 17 ноября 2010

Семантически, они будут вести себя одинаково - будет установлен второй элемент - но не указано, как компилятор достигнет этого.

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

Поскольку вы не можете сказать,разница, так или иначе, обычно вы можете считать их идентичными , даже если реализация отличается.

0 голосов
/ 17 ноября 2010

Смотри и смотри!

Изучите код сборки, который генерирует ваш компилятор с различными уровнями оптимизации. Я гарантирую, что вы многому научитесь таким образом.

...