Однако имеет ли это снижение производительности по сравнению с выполнением арифметики с указателем вручную?
Выражения, использующие оператор индексирования, определены , чтобы быть эквивалентными соответствующим операциям, включающим арифметику указателя и разыменование, поэтому
&p[i]
в точности эквивалентно
&(*(p + i))
Кроме того, в стандарте указывается, что когда операнд оператора &
является результатом оператора *
, ни один из них не оценивается, и результат такой, как если бы оба опущены, что, в свою очередь, эквивалентно
p + i
, который определил поведение, если он не предназначен для создания указателя до начала массива, из которого был получен указатель p
, и не более чем на одну позицию после его конца.
Хотя вполне возможно, что компилятор будет генерировать код, отличающийся или хуже, в одном случае, чем в другом, нет оснований ожидать этого.
Есть ли причины, по которым следует избегать первого?
Не очень. Последний имеет меньшую когнитивную нагрузку и его легче читать, поскольку (синтаксически) он включает только одну операцию, а не две. Я склонен предпочесть это сам по этой причине. С другой стороны, понимание может быть немного менее интуитивным.