TGStat
TGStat
Введите текст для поиска
Расширенный поиск каналов
  • Язык сайта
    flag Russian flag English flag Uzbek
  • Вход на сайт
  • Каталог
    Каталог каналов и чатов Региональные подборки Тематические подборки Платные каналы Поиск каналов
    Добавить канал/чат
  • Рейтинги
    Рейтинг каналов Рейтинг чатов Рейтинг публикаций
    Рейтинги брендов и персон
  • Аналитика
  • Поиск по публикациям
  • Мониторинг Telegram
  • Продвижение
    Реклама через Яндекс Бизнес Реклама в каналах через TGStat Agency Реклама на сайте TGStat.ru
Hardcore programmer

28 May 2024, 05:51

Открыть в Telegram Поделиться Пожаловаться

Выравнивание памяти - что это и зачем оно нужно?

Если ответить совсем кратко, то это размещение данных в памяти таким образом, чтобы они распологались по адресам кратным некоторой степени 2. Но что это даёт?

Как вам должно быть уже известно, процессоры оперируют блоками данных называемыми машинное слово, размер которого идентичен размеру регистров и разрядности самого процессора, то есть на 64 разрядном процессоре машинное слово будет занимать 64 бита (или 8 байт).

Но наши программы зачастую хотят оперировать типами меньшей размерности. Например многие программы работают со строками, которые по своей сути являются массивами отдельных байт, то есть нам нужно оперировать типом вроде char в языке C. Для процессора не является большой проблемой загрузить подобный тип на регистр, но сделает он это следующим образом:
1. загрузит машинное слово содержащие нужный нам байт,
2. побитовым сдвигом переместит его в 0 позицию,
3. побитовым И откинет лишние биты.
После этого мы можем применять к регистру любые операции, которые мы хотим применить к нашему байту. Проблем здесь нет никаких в каком бы адресе не был размещён наш char. Поэтому его выравнивание будет 1, что позволит разместить его в любом адресе.

Но теперь давайте посмотрим на тип int, который занимает 4 байта. Давайте для простоты представим, что он размещён по адресу 3. Вроде проблем пока тоже никаких, процессор применит все те же операции и на регистре окажется наш int. Но что если у нас массив этих int? Тогда следующий из них будет расположен по адресу 7 и будет пересекать границу машинного слова. Процессору уже придётся загрузить сразу 2 машинных слова (по адресам 0 и 8) на разные регистры, каждый из них очистить от лишних бит, выставить биты на нужные позиции, а затем объединить 2 регистра через побитовое ИЛИ. Процессоры Intel и AMD вполне справляются с подобной задачей, но затрачивают на неё гораздо больше операций. А вот процессоры с архитектурой ARM откажутся исполнять такое непотребство, по крайней мере в автоматическом режиме (никто не мешает нам то же самое проделать в собственном коде). Но гораздо эффективнее всегда размещать int только по адресам кратным 4, или по простому выравнивать по 4 байта.

К нашему счастью компиляторы достаточно умные, что бы соблюдать выравнивание для всех типов. Правда при этом возникает один нюанс, для понимания которого давайте посмотрим на такую структуру:

struct example {
char a;
int b;
};
Поле a имеет выравнивание 1, а поле b - 4. Что бы это соблюдалось вся структура должна иметь выравнивание, как самое большое выравнивание её полей, то есть 4. Что в итоге приведёт к тому, что наш char так же будет выравнен по 4 байтам. При этом вся структура будет иметь размер 8 байт, а возле поля a окажутся 3 мусорных байта, которые никак не используются. Такие байты называют "паддинг". Это вынужденая трата памяти, которая обеспечивает нам быстродействие и работоспособность на разных платформах.

При проектировании структур имеет смысл учитывать эту особенность. К тому же стандарты языков C и C++ требуют, чтобы поля структуры были расположены в памяти в том же порядке, что и в коде. А вот компилятор языка Rust умеет переставлять поля местами ради оптимизации места занимаемого паддингами, что несомненно плюс, но требует более аккуратного подхода при низкоуровневых операциях с памятью структур. В крайних случаях ему можно указать, чтоб он обращался с конкретными типами так же как принято в C.

2.6k 0 22 26 57
Каталог
Каталог каналов и чатов Подборки каналов Поиск каналов Добавить канал/чат
Рейтинги
Рейтинг каналов Telegram Рейтинг чатов Telegram Рейтинг публикаций Рейтинги брендов и персон
API
API статистики API поиска публикаций API Callback
Наши каналы
@TGStat @TGStat_Chat @telepulse @TGStatAPI
Почитать
Академия TGStat Исследование Telegram 2019 Исследование Telegram 2021 Исследование Telegram 2023
Контакты
Справочный центр Поддержка Почта Вакансии
Всякая всячина
Пользовательское соглашение Политика конфиденциальности Публичная оферта
Наши боты
@TGStat_Bot @SearcheeBot @TGAlertsBot @tg_analytics_bot @TGStatChatBot