Функция unsafe.Alignof
Функция unsafe.Alignof возвращает выравнивание (alignment) переменной в памяти.
В качестве аргумента она принимает выражение любого типа и возвращает константу типа
uintptr, которая представляет собой количество байт, необходимое для выравнивания
значения в памяти. Выравнивание определяет, по какому адресу памяти должен располагаться
объект для оптимального доступа к нему процессором.
Синтаксис
unsafe.Alignof(x)
Пример
Давайте определим выравнивание для различных типов данных:
package 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))
}
Результат выполнения кода:
8
8
1
8
Пример
Давайте определим выравнивание для полей структуры:
package 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))
}
Результат выполнения кода:
8
8
Пример
Давайте сравним выравнивание с размером типа с помощью unsafe.Sizeof:
package 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))
}
Результат выполнения кода:
"Sizeof: 24"
"Alignof: 8"
"Alignof a: 1"
"Alignof b: 8"
"Alignof c: 1"
Смотрите также
-
функцию
unsafe.Sizeof,
которая возвращает размер переменной в байтах -
функцию
unsafe.Offsetof,
которая возвращает смещение поля структуры -
тип
unsafe.Pointer,
который позволяет работать с указателями в низкоуровневом коде -
функцию
unsafe.Add,
которая выполняет арифметические операции над указателями