Ответ 1
Ответ на ваш вопрос во многом зависит от того, какой компилятор вы используете, и от внутренних действий вашего процессора, контроллера памяти и архитектуры памяти (кеш и внешняя память).
У вас есть только контроль над компилятором (при условии, что вы используете компилятор C или С++). Компиляторы имеют разные режимы для случаев, когда вы используете переменные, размер которых меньше размера слова. Существуют флаги для оптимизации скорости и оптимизации памяти. В зависимости от того, какой из этих флагов включен, компилятор может выбрать создание кода, который объединяет все четыре переменные (в вашем случае) в одно слово. Или компилятор может выбрать выделение слова памяти для каждой из переменных, но использовать конкретный байт для хранения фактического значения. Способ, которым компилятор будет делать это для каждого из случаев, состоит в том, чтобы генерировать различные команды инструкций для ЦП. В последнем случае, если переменная считывается из памяти, тогда все слово помещается на шину, а затем в регистр общего назначения. В первом случае слово помещается в регистр, но тогда слово может быть сдвинуто по биту, а остальные биты могут быть обнулены с использованием логической операции И. Таким образом, правый байт будет в регистре. Или может быть архитектура ЦП поддерживает доступ к уровню байтов в слове, и в этом случае это будет только одна операция, выполняемая ЦП.
В конце концов, это хорошая идея, чтобы понять, что происходит внутри, но вам все равно, потому что набор инструкций, сгенерированных компилятором, будет работать правильно с вашей точки зрения. Единственный раз, когда вы будете заботиться, - это когда вы пишете программное обеспечение, чувствительное к производительности. В этом случае вам понадобятся сведения о вашем процессоре и памяти, а также флаги, поддерживаемые компилятором.