CodeBlanks Logo Icon CodeBlanks

Sizeof ve Alignof

Sizeof ve Alignof ile bellek yerleşimini öğrenirsin.

Sizeof ve Alignof

unsafe.Sizeof bir türün bayt boyutunu, unsafe.Alignof ise o türün bellekte hangi bayt sınırına yerleştirilmesi gerektiğini verir. 64 bit sistemde int64 8 bayttır ve 8'e hizalanır.

fmt.Println(unsafe.Sizeof(int16(0)), unsafe.Alignof(int16(0)))  // 2 2

İkisi de derleme anında hesaplanan sabitlerdir.

Alan sırası ve dolgu

Alanları büyükten küçüğe sıralamak dolguyu azaltır:

type Kotu struct { a bool; b int64; c bool }  // 24 bayt
type Iyi  struct { b int64; a bool; c bool }  // 16 bayt

Milyonlarca kayıt tutan dilimlerde bu fark ciddi bellek kazancı demektir. fieldalignment aracı bu sıralamayı önerir.

Uygulama Dolguyu gör

type A struct { x bool; y int64; z bool } ve type B struct { y int64; x bool; z bool } tanımla. İkisinin unsafe.Sizeof değerini tek satırda yazdır.

Başlangıç kodu

main.go
package main

import (
    "fmt"
    "unsafe"
)

func main() {
    // buraya yaz
}

Örnek çözüm

main.go
package main

import (
    "fmt"
    "unsafe"
)

type A struct {
    x bool
    y int64
    z bool
}

type B struct {
    y int64
    x bool
    z bool
}

func main() {
    fmt.Println(unsafe.Sizeof(A{}), unsafe.Sizeof(B{}))
}

Beklenen çıktı

24 16

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 64 bit sistemde <code>struct{ a bool; b int64 }</code> kaç bayttır?

  • 10
  • 16 Doğru cevap
  • 9
  • 8

Açıklama: b alanı 8'e hizalanmalı; a'dan sonra 7 bayt dolgu eklenir: 1 + 7 + 8 = 16.

2 Hizalamayı sor

Soru
var x int64
fmt.Println(unsafe.____(x))  // 8
Cevap
var x int64
fmt.Println(unsafe.Alignof(x))  // 8

Açıklama: Alignof türün bellek hizalamasını verir.

3 Bellek yerleşimi

Kavram Anlamı
Sizeof Toplam bayt
Alignof Hizalama sınırı
Dolgu (padding) Hizalama için boş bayt
Alan sıralaması Dolguyu azaltır

İleri seviye bölümündeki tüm dersler