Почему при объявлении переменной, в любом языке программирования, резервируется весь размер памяти отведённый под тип данных?
Пример с SSD некорректный, все равно что требовать от камаза, например, выпустить грузовик с грузоподъемностью 20кг. Производителю нужен рынок сбыта.
Тем не менее, небольшие чипы памяти существуют, только никто на них не пишет, что это "SSD".
Выделение памяти - операция не бесплатная, и кто-то решил, что так будет выгоднее.
https://randomascii.wordpress.com/2014/12/10/hidde...
https://habr.com/ru/post/270009/Как-то всё топорски устроеноВы можете написать сви менеджеры памяти,компиляторы и другие сопутствующие штуки. Не исключено, что обретете мировую известность. Но не думайте, что до вас никто не пытался.
ZakkMalin,  ну а что она не может быть динамической, зачем хранить и передавать 2 миллиарда, если скажем внутри переменной простое число 1?то есть все таки надо объяснять...
Для начала: Есть размерность регистров, которые принимают переменные в размере разрядности регистра, и в целом быстрее и удобнее хранить переменную размером в битность регистра. Все что меньше требует оверхеда по обработке "лишнего" места, все что больше - требует разбиения на несколько регистровых переменных(это очевидно для людей работавших с асмом). В основном типы данных - это компромисс из потери скорости работы и экономии места в памяти. 
Далее, к вопросу динамически меняющихся размеров переменной - любая аллокация - дикий оверхед в 3 и более операции, а так как данные в куче идут подряд, без аллокации расширить размер переменной не получится. К этому добавьте фрагментацию кучи, что тоже серьезно добавляет тормозов. 
Есть еще куча всякого разного из нюансов, но это основные аргументы.