Sizeof ve Alignof
- Go kursu
- İleri seviye
- Ders 9/68
- 4 dk
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 baytMilyonlarca 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
package main
import (
"fmt"
"unsafe"
)
func main() {
// buraya yaz
}Örnek çözüm
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
var x int64
fmt.Println(unsafe.____(x)) // 8
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 |