Это связано с выравниванием структуры данных. Цитирую статью из Википедии:
Выравнивание данных означает размещение данных по адресу памяти, кратному размеру слова, что повышает производительность системы благодаря тому, как ЦП обрабатывает память. Чтобы выровнять данные, может потребоваться вставить несколько бессмысленных байтов между концом последней структуры данных и началом следующей, что является дополнением структуры данных.
Поскольку int составляет 4 байта, KeyValuePair имеет значение long, а int приведет к смещению структур данных. Это приведет к значительному падению производительности. Поэтому лучше «тратить» 4 байта на каждую запись, чтобы данные были выровнены и, следовательно, могли быть эффективно записаны и прочитаны.
Что касается того, почему одиночные целые числа не заполняются - не забывайте, что со структурой/классом относительно легко добавить переменную заполнения, но для простого типа значения у вас нет этой структуры/класса. Я предполагаю, что требуемая дополнительная работа (добавление фиктивной структуры вокруг int для вставки заполнения) не стоит увеличения производительности.
Здесь нет никакой разницы между 32-битными и 64-битными операционными системами, они все равно нуждаются в отступах и выравнивании, но количество отступов может различаться.
В «старые времена» вам часто приходилось вручную добавлять отступы к структурам данных, чтобы получить правильное выравнивание, в наши дни это, как правило, обрабатывается компилятором автоматически.
person
ChrisF
schedule
02.02.2016