Каково значение использования определенного числового типа над другим - PullRequest
0 голосов
/ 29 августа 2018

Каково значение памяти для хранения целого числа как определенного числового типа (uint8, int16, uint32, int64 и т. Д.)? Я знаю диапазон целых чисел, которые может принимать каждый из типов, но есть ли какая-то эффективность использования памяти, которую можно достичь с помощью соответствующего типа?

Например, в Голанге «кажется» более эффективным хранить чей-то возраст как uint8, а не как единицу измерения (что эквивалентно uint32 или uint64 в соответствии с его спецификацией https://golang.org/ref/spec#Numeric_types)

Ответы [ 2 ]

0 голосов
/ 29 августа 2018

1) Целые числа фиксированного размера можно использовать для уменьшения памяти, используемой вашим приложением. Например, в 3D-приложении может иметь смысл использовать float32 вместо float64, потому что видеокарта в любом случае хочет float32 s, и использовать uint16 вместо uint32 для индексов рисования, например.

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

2) При записи на диск, например, используя пакет encoding / binary , вы не можете использовать int или uint, поскольку их размер изменяется в разных операционных системах. Вы должны использовать значения известного размера, чтобы сделать формат файла однозначным.

3) При взаимодействии с API операционной системы часто требуется использовать переменные фиксированного размера. Например, Windows API - это 32-битный API, что означает, что при загрузке Windows DLL вам часто нужно использовать 32-битные целые числа без знака для флагов и т. Д.

0 голосов
/ 29 августа 2018

Фиксированные целые числа

Фиксированные целые числа требуют точного объема памяти. Используя меньший целочисленный тип «здесь и там» для отдельных переменных, вы получите только небольшой объем памяти, если таковой имеется. Также при использовании в качестве типов структурных полей вы снова можете ничего не получить из-за неявных заполнений.

Увеличение памяти может быть заметным и значительным, если вы используете целые числа фиксированного размера в качестве типа элементов (больших) срезов или массивов.

Другая (возможно, более важная) причина использования целых чисел фиксированного размера может заключаться в сообщении того, что вы в них храните. С таким же успехом вы можете использовать тип int32 или int64 для хранения байтов, но, будучи очевидной тратой, они не передают допустимый диапазон данных, хранящихся в них.

Еще один момент - это эффективность. Вы всегда можете использовать int64 вместо других целочисленных типов со знаком, но на некоторых архитектурах выполнение операций на int64 может потребовать нескольких операций с регистрами и, следовательно, значительно медленнее. Также тип rune (псевдоним для int32) четко указывает, что вы собираетесь использовать его для кодовых точек Юникода.

Еще один момент - последовательность. Если вы используете int32 для моделирования чего-либо в одном месте, вы должны придерживаться этого и везде использовать один и тот же тип. Это более важно в Go, чем в других языках, потому что система типов Go является строгой (более строгой, чем в большинстве других языков), то есть, если у вас есть значение типа int32, вы не можете присвоить его переменной int64 тип и наоборот без явного преобразования.

int против целых чисел фиксированного размера

Типы int и uint не являются фиксированными размерами, но соответствуют Спецификация: Числовые типы:

uint     either 32 or 64 bits
int      same size as uint

Когда вы используете int, компилятор может создавать более оптимизированный код, ориентируясь на разные архитектуры. Обычно int является 32-разрядным при нацеливании на 32-разрядные архитектуры и 64-разрядным при нацеливании на 64-разрядные архитектуры. Это означает, что размер int будет соответствовать размеру регистра целевой архитектуры, поэтому целочисленные операции можно эффективно выполнять с помощью операций с одним регистром. Например, если вы используете int64, это может потребовать выполнения нескольких (регистровых) операций для выполнения одной целочисленной операции в 32-разрядной архитектуре.

Мне нравится думать, что int является целочисленным типом, который используется для описания и передачи определенных частей или компонентов структур данных времени выполнения Go в наилучшем виде, который он считает подходящим. Например, для индексирования массивов или фрагментов или для описания их размеров int - это «естественный» тип для использования.

Спецификация: длина и емкость:

Встроенные функции len и cap принимают аргументы различных типов и возвращают результат типа int. Реализация гарантирует, что результат всегда вписывается в int. Например, для индексирования фрагментов или массива или для описания их длины и емкости int - это «естественный» тип, рекомендуемый или применяемый.

При использовании оператора for range с хотя бы одной переменной итерации для массивов, срезов или значений string переменная итерации («индекс») будет иметь тип int.

Также обратите внимание, что Роб Пайк представил предложение для Go 2 об изменении int на произвольную точность. предложение: spec: изменить int на произвольную точность

...