Самый эффективный арифметический тип указателя в 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
, и всегда хорошо его включить.