Найти тему

Как значения Go выглядят в памяти? Часть 1

Оглавление

Блог группы Marpa3D.

На основании размышлений Russ Cox.

Структуры данных в Go. Продолжение от Marpa3D
Структуры данных в Go. Продолжение от Marpa3D

Многие программисты часто просто применяют языковые конструкции не задумываясь о том, а как значения Go выглядят в памяти? Это нужно понимать, чтобы сформировать правильное представление о том, какие операции являются дорогостоящими, а какие нет. Эта статья посвящена базовым типам и структурам, массивам и срезам.

Основные типы

Посмотрим на пример:

-2

Переменная i имеет тип int, представленные в памяти в виде одного 32-разрядного слова. (На всех этих рисунках показано 32-разрядное расположение памяти.)

Переменная j имеет тип int32 из-за явного преобразования. Даже несмотря на то , что i и j имеют одинаковую структуру памяти, но имеют разные типы: назначение i = j является ошибкой типа и должна быть записана с явным преобразованием: i = int(j).

Переменная f имеет тип float, которые текущие реализации представляют как 32-разрядное значение с плавающей запятой. Он занимает тот же объем памяти, что и int32 но другой внутренний макет.

Структуры и указатели

Идем дальше. В Go все решает тип! Переменная byte имеет тип [5]byte, представляющий собой массив из пяти элементов. Его расположение в памяти - 5 байт, следующие один за другим, непрерывно. То же самое с массивом primes, только у него 4 элемента.

Go, как и C, дает программисту контроль над тем, что является указателем, а что нет. Например, это определение типа:

type Point struct { X, Y int }

определяет простой структурный тип с именем Point, представленный в виде двух смежных int (целые числа) в памяти.

Структуры и указатели
Структуры и указатели

Point{10, 20} обозначает инициализированный Point. Взятие адреса составного литерала обозначает указатель на только что выделенный и инициализированный Point. p - это два слова в памяти; pp - указатель на два слова в памяти.

Поля в структуре располагаются рядом в памяти.

type Rect1 struct { Min, Max Point }
type Rect2 struct { Min, Max *Point }

Расположение полей структуры в памяти
Расположение полей структуры в памяти

Для более глубокого погружения в структуры данных рекомендую прочитать краткий цикл наших статей об этом!

Продолжение следует... Читайте нас дальше!)
Подробнее о нас на сайте
marpa.su