Использование регистров — и, технически, даже существование регистров вообще — это характеристика реализации C и оборудования, на котором она работает. Поэтому нет окончательного ответа на ваш вопрос на его уровне общности. Это по большей части верно для любого вопроса о том, «что происходит под капотом».
Однако, говоря о типичных реализациях для массового оборудования,
Мое понимание: когда я использую calloc, я выделяю раздел памяти в единицах байтов.
Разумная характеристика.
Переменные хранятся в регистрах размером 32 бита (или 4 байта).
Нет. Значения хранятся в регистрах. Реализации обычно обеспечивают хранение значений переменных в обычной памяти, хотя эти значения могут быть скопированы в регистры для вычислений.
При некоторых обстоятельствах, зависящих от реализации, некоторые переменные могут не иметь связанной ячейки памяти, а их значения будут храниться только в регистрах. Однако, вообще говоря, это никогда не относится к переменным или выделенному пространству, на которое есть, было или когда-либо могло быть обращение с помощью указателя.
В моей программе я пишу символы, используя свой указатель (например, *ptr = '!';), а затем увеличиваю точки (ptr++;), чтобы перейти к следующему регистру.
Нет, абсолютно нет. Увеличение указателя приводит к тому, что он указывает на следующий элемент вашей динамической памяти, измеряемый в единицах размера указываемого типа. Это не имеет никакого отношения к реестрам. Запись в указанный объект, вероятно, требует использования регистра (поскольку именно так работают ЦП), но в конечном итоге записанный символ оказывается в обычной памяти.
Мой вопрос: если регистры 32-битные и я записываю в этот регистр только 8-битные, оставшиеся 24-битные не используются?
Как я уже объяснил, этот вопрос основан на заблуждении. Целью вашей записи не является регистр. В любом случае между записываемыми вами элементами нет пробелов в памяти.
Вполне возможно, что при некоторых обстоятельствах умный компилятор может оптимизировать ваш код, чтобы свести к минимуму записи в память, собирая байты в регистре и выполняя запись фрагментами такого размера. Сможет ли он или будет это делать, зависит от реализации и действующих опций.
Если нет, то указатели, которые я использую, указывают на какое-то 8-битное выделение подрегистров, указывая на 8-битные разделы регистров?
Ваши указатели (логически) указывают на основную память, которая (логически) адресуется в единицах размера байта. Они не указывают на регистры.
person
John Bollinger
schedule
22.02.2017
'!'
относится к типуint
, а не к типуchar
, поэтому будет использоваться полная ширина регистра, не оставляя неиспользуемых битов. - person Weather Vane   schedule 22.02.2017register
для C, что является чем-то совершенно другим. - person Jens Gustedt   schedule 22.02.2017