Структуры представляют тип данных, определяемый разработчиком и служащий для представления каких-либо объектов. Структуры содержат набор полей, которые представляют различные атрибуты объекта. Для определения структуры применяются ключевые слова type и struct:
Структуры позволяют аккуратно инкапсулировать все данные, относящиеся к одному объекту,, после чего поведение объекта может быть реализовано путем определения функций для структуры.
В этом посте я попытаюсь объяснить, как мы можем эффективно писать структуры с точки зрения использования памяти ЦП.
Давайте рассмотрим структуру ниже:
Теперь посмотрим, сколько памяти требуется для структуры TerraformResource, используя приведенный ниже код.
Вывод:
Таким образом, общий объем памяти, необходимый для создаой структуры TerraformResource, составляет 88 байт. Так будет выглядеть выделение памяти для типа TerraformResource
Но почему 88 байт, 16 + 16 + 1 + 16 + 1 + 16 + 4 = 70 байт, откуда берутся эти дополнительные 18 байт?
Когда дело доходит до выделения памяти для структур, им всегда выделяются , выровненные по байтам блоки памяти, а поля выделяются и сохраняются в том порядке, в котором они определены. Подробнее про выделение памяти в GO можно почитать здесь.
Мы ясно видим, что TerraformResource.HaveDSL , TerraformResource.isVersionControlled и TerraformResource.ModuleVersionMajor занимают 1 байт, 1 байт и 4 байта соответственно. Остальное пространство заполняется пустыми байтами
Итак, возвращаясь к той же математике
Байты распределения = 16 байт + 16 байт + 1 байт + 16 байт + 1 байт + 16 байт + 4 байта = 70 байт
Пустые байты заполнения = 7 байт + 7 байт + 4 байта = 18 байт
Всего байтов = байты распределения + пустые байты заполнения = 70 байтов + 18 байтов = 88 байтов
Итак, как мы это исправим? А что, если мы переопределим нашу структуру следующим образом.
Вывод:
Теперь общее выделение памяти для типа TerraformResource составляет 72 байта. Давайте посмотрим, как выглядит выравнивание памяти.
Однако оптимизированная структура содержит всего 9 слов, как показано ниже.
Определив нашу структуру с правильно определенными структурами данных, мы смогли эффективно использовать выделение памяти и реализовали правильную и эффективную структуру с точки зрения потребления ресурсов ЦП.
Это всего лишь небольшой пример, подумайте о большой структуре с 20 или 30 полями разных типов. Вдумчивое определение структуры данных действительно окупается… 🤩
Надеюсь, что этот пост смог пролить свет на внутреннее устройство структур, их распределение памяти и потребляемые ресурсы ЦП. Надеюсь этот пост вам поможет!!
Удачного кодинга!!