CodeBlanks Logo Icon CodeBlanks

Bellek hizalama

  • C kursu
  • İleri seviye
  • Ders 77/83
  • 5 dk

Bellek hizalama ve struct packing öğrenirsin.

Bellek hizalama

Bellek hizalama (memory alignment), bir verinin adresinin belirli bir katı olmasını sağlar. CPU hizalanmış veriyi tek komutla okur; hızasız veri birden fazla erişim gerektirir ve yavaşlar.

_Alignof(int) bir türün gerekli hizalamasını verir; Linux x86-64'te int için 4'tür. struct'ta alan sırası, toplam boyutu etkiler: struct { char tag; int value; }'ta tag'den sonra 3 bayt dolgu (padding) eklenir; offsetof(struct Item, value) 4 döner. Alanları büyükten küçüğe sıralamak dolguyu azaltır.

Item yapısı

struct Item { char tag; int value; } tanımlarsın. tag 1 bayt, value 4 bayt hizalıdır. Araya 3 bayt dolgu girer; offsetof(struct Item, value) 4 döner.

Bu derste _Alignof(int) ile int hizalamasını (4) ve offsetof(struct Item, value) ile value'nun ofsetini (4) yazdırıyoruz. İkisi de 4'tür. <stddef.h> başlığı offsetof makrosunu sağlar. Bu bilgi, struct boyutunu ve bellek yerleşimini anlamak için temeldir.

Uygulama Hizalama ve ofset

struct Item { char tag; int value; }; tanımla. main'de printf("hizalama: %zu\n", (size_t)_Alignof(int)); ve printf("ofset: %zu\n", offsetof(struct Item, value));. <stddef.h> başlığını ekle.

Başlangıç kodu

main.c
#include <stdio.h>
#include <stddef.h>

// Item yapısı tanımla: char tag, int value
// main: int hizalamasını ve value'nun ofsetini yazdır

int main(void) {
    return 0;
}

Örnek çözüm

main.c
#include <stdio.h>
#include <stddef.h>

struct Item {
    char tag;
    int value;
};

int main(void) {
    printf("hizalama: %zu\n", (size_t)_Alignof(int));
    printf("ofset: %zu\n", offsetof(struct Item, value));
    return 0;
}

Beklenen çıktı

hizalama: 4
ofset: 4

Soru ve cevaplar

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

1 Hizalama kavramlarını eşle

Kavram Anlamı
_Alignof Tür hizalaması
offsetof Alan konumu
padding Dolgu bayt
struct Alan sırası

2 _Alignof(int) Linux x86-64'te kaçtır?

  • 4 Doğru cevap
  • 1
  • 2
  • 8

Açıklama: int 4 bayt hizalıdır; _Alignof 4 döner.

3 _Alignof çağrısı

Soru
printf("hizalama: %zu
", (size_t)_Alignof(____));
Cevap
printf("hizalama: %zu
", (size_t)_Alignof(int));

Açıklama: _Alignof(int) int hizalamasını verir.

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