Самый эффективный арифметический тип указателя в c

Я предполагаю, что внутреннее кастинг происходит, когда мы пишем: arr[i] (что эквивалентно *(arr+i)). Потому что i может быть, например, short, int или long или беззнаковый вариант любого из этих трех.

Итак, мой вопрос прост: какой тип должен i быть таким, чтобы не происходило никакого внутреннего преобразования? Чтобы код мог работать наиболее эффективно?

Грубая догадка: size_t?

Ответы

Ответ 1

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

Ответ 2

Мой ответ заключается в том, чтобы сохранить это просто, возможно, вы хотите typedef тип для индекса, например:

typedef size_t TPtrIdx;

и таким образом вы можете легко перевести тип в то, что вы хотите, сейчас или через год.

Что касается потенциальных проблем между преобразованиями из/в подписанные и неподписанные типы, то что-то, что хороший компилятор может обработать для вас, например gcc предлагает флаг -Wconversion, и всегда хорошо его включить.