Общий вид
Память - это «вещь», способная хранить информацию во времени. Вот что такое человеческая память, вот что такое компьютерная память.
В компьютерах - аппаратное обеспечение
Провода (представьте как кабели, так и отпечатанные провода на плате) - это физические объекты, которые передают информацию (так или иначе). Элементы схемы, такие как логические элементы, являются физическими объектами, которые преобразуют информацию. Но они не способны хранить информацию. Память - это аппаратное устройство, которое способно хранить информацию и, конечно же, возвращать эту информацию с течением времени.
В компьютерах организация логической памяти наиболее часто используется в битах и битах. Бит хранит двоичную цифру, которая может иметь значение 0
или значение 1
.
Физически, в интегральных схемах немного более-менее транзистор. На жестких дисках это магнитная зона на платане, на компакт-дисках это отражающая или нет зона на диске.
Биты сгруппированы по 8 в байтах. Чтобы «хранить информацию» и «извлекать информацию» из памяти, вам необходимо, чтобы память была адресуемой. То есть вам нужен способ уникальной идентификации области памяти, где вы хотите хранить информацию или откуда ее загружать. Память компьютера адресуется в байтах, что означает, что каждый байт имеет уникальный адрес. Физические адреса байтов памяти являются смежными. Он начинается с адреса 0x0000
и продолжается без пробелов.
В С ++
C ++ не имеет отношения к аппаратному обеспечению. Но логически все одинаково: биты организованы в байтах, память имеет байтовый адрес.
Тип в C ++ определяется размером занимаемой памяти, набором возможных значений
и набор возможных операций над данными.
Давайте возьмем std::uint8_t
. Его размер 1
, что означает, что он занимает всего 1 байт. Поскольку 1 байт имеет 8 битов (в большинстве реализаций), для типа std::uint8_t
существует 2 ^ 8 возможных различных значений. Поскольку это просто, значение unsigned char
является значением числа в базе 2, образованного битами байта. Например. для битов 0000 0110
значение равно значению числа 0000 0110 (base 2) == 6 (base 10)
Для больших типов данных, например std::int32_t
, размер равен 4
, поэтому он занимает 4 смежных байта. Это означает 2^32
возможных значений. Вопрос снова в том, как сопоставить эффективные битовые комбинации, которые вы находите в памяти в этих 4 байтах, с целым числом? Это называется схемой кодирования. На аппаратном уровне мы заботимся о маленьких или больших машинах с прямым порядком байтов, которые определяют, в каком порядке мы берем байты. После этого последовательность битов преобразуется в число (или наоборот, число преобразуется в последовательность битов) по схеме кодирования дополнения к двум (обязательным начиная с C ++ 20).
За исключением того, что по архаичным причинам самый маленький адресуемый блок памяти не называется байтом. Это называется char
(badum tss).