Когда ЦП обращается к памяти для выборки элемента данных (или члена структуры), он фактически отправляет запрос контроллеру памяти, который выполняет некоторые уловки, чтобы DRAM выглядело как хорошо структурированное хранилище данных. На самом деле DRAM - это группа ячеек, расположенных в M строках по N бит в каждой (где N может быть около тысячи).
Зная, что большинство архитектур обрабатывают 4, 8, 16 или 32 (а иногда и более крупные) бита за раз, контроллеры памяти оптимизированы для выборки с адресов, кратных 4. Что происходит, когда вы выбираете один байт с адреса abcd1002? Что ж, контроллер памяти извлекает четыре байта из адреса abcd1000, затем сдвигает их, чтобы получить третий байт (помните, это 0, 1, затем 2), и дает вам ваш паршивый невыровненный байт. Таким образом, выборка с выровненного адреса всегда быстрее, чем с невыровненного.
Сознавая этот факт, компиляторы агрессивно оптимизируют скорость, заполняя структуры данных так, чтобы они располагались в удобном для памяти виде.
Надеюсь, что это дает важный взгляд на архитектуру компьютера по этому вопросу. Я не видел, чтобы об этом упоминалось ни в одном из текущих ответов, поэтому мне захотелось добавить свои 0,02 доллара.
person
Rahul Banerjee
schedule
17.03.2013
pNext
и_isFree
. Вы можете принудительно выполнить упаковку с помощью механизмов, специфичных для компилятора. - person cnicutar   schedule 18.03.2013sizeof(struct BlockDescriptor)
? - person Philip Kendall   schedule 18.03.2013