Функция unsafe.Alignof

Функция unsafe.Alignof возвращает выравнивание (alignment) переменной в памяти. В качестве аргумента она принимает выражение любого типа и возвращает константу типа uintptr, которая представляет собой количество байт, необходимое для выравнивания значения в памяти. Выравнивание определяет, по какому адресу памяти должен располагаться объект для оптимального доступа к нему процессором.

Синтаксис

gounsafe.Alignof(x)

Пример

Давайте определим выравнивание для различных типов данных:

gopackage main

import (
  "fmt"
  "unsafe"
)

func main() {
  var i int
  var f float64
  var b bool
  var s string

  fmt.Println(unsafe.Alignof(i))
  fmt.Println(unsafe.Alignof(f))
  fmt.Println(unsafe.Alignof(b))
  fmt.Println(unsafe.Alignof(s))
}

Результат выполнения кода:

go8
8
1
8

Пример

Давайте определим выравнивание для полей структуры:

gopackage main

import (
  "fmt"
  "unsafe"
)

type User struct {
  age  int
  name string
}

func main() {
  u := User{age: 30, name: "John"}
  
  fmt.Println(unsafe.Alignof(u.age))
  fmt.Println(unsafe.Alignof(u.name))
}

Результат выполнения кода:

go8
8

Пример

Давайте сравним выравнивание с размером типа с помощью unsafe.Sizeof:

gopackage main

import (
  "fmt"
  "unsafe"
)

type Data struct {
  a byte
  b int64
  c bool
}

func main() {
  d := Data{a: 1, b: 100, c: true}
  
  fmt.Printf("Sizeof: %d\n", unsafe.Sizeof(d))
  fmt.Printf("Alignof: %d\n", unsafe.Alignof(d))
  fmt.Printf("Alignof a: %d\n", unsafe.Alignof(d.a))
  fmt.Printf("Alignof b: %d\n", unsafe.Alignof(d.b))
  fmt.Printf("Alignof c: %d\n", unsafe.Alignof(d.c))
}

Результат выполнения кода:

go"Sizeof: 24"
"Alignof: 8"
"Alignof a: 1"
"Alignof b: 8"
"Alignof c: 1"

Смотрите также

  • функцию unsafe.Sizeof,
    которая возвращает размер переменной в байтах
  • функцию unsafe.Offsetof,
    которая возвращает смещение поля структуры
  • тип unsafe.Pointer,
    который позволяет работать с указателями в низкоуровневом коде
  • функцию unsafe.Add,
    которая выполняет арифметические операции над указателями