Ответ 1
Ответ на вторую часть вашего вопроса (на большинстве современных ОС) - это виртуальная память.
Вы начинаете с аппаратного уровня с физической памятью. Это то, что ты можешь на самом деле тыкать пальцем. Это то, что видит операционная система. Операционная система позволяет запускать процессы с абстракцией, называемой виртуальной памятью.
Каждый процесс получает свое собственное пространство виртуальной памяти. Поэтому он может притворяться, что это единственный процесс, и он имеет массу памяти. Затем каждый раз, когда вы получаете доступ к памяти, вы указываете виртуальный адрес, который сопоставляется с физическим адресом. Операционная система хранит таблицу, для которой виртуальный адрес сопоставляется с фактическими физическими адресами в ОЗУ. Как правило, это делается с использованием некоторых специальных аппаратных средств (MMU, модуль управления памятью) по соображениям производительности, но вы также можете сделать это на 100% в программном обеспечении.
Итак, когда вы говорите 0x000 в своей программе, это виртуальный адрес. При чтении или записи он переходит на физический адрес компьютера. Таким образом, в другом процессе один и тот же виртуальный адрес 0x000 отображает другой физический адрес. Эта система позволяет вам писать свою программу, не зная точно, сколько оперативной памяти доступно или какой адрес будет загружен в вашу программу. Это также предотвращает вашу программу из памяти, которая принадлежит другой программе.
Что касается первой части, абсолютно. Различные типы данных занимают разные объемы памяти. Вы должны знать, сколько места вам нужно, когда вы размещаете свои структуры данных. Также есть вопросы по выравниванию байтов. Многобайтовые типы данных (например, числа с плавающей запятой) часто должны начинаться с адреса, который делится на 2 или 4 или числа байтов, необходимых для хранения поплавка - это требование процессора или ОЗУ. Таким образом, вы не можете просто объединить все свои данные вместе, один байт после следующего, вы должны выложить его в определенном порядке, например, собрать вместе кусочки головоломки, если вы хотите свести к минимуму неиспользованную память.