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