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
#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
#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ı
printf("hizalama: %zu
", (size_t)_Alignof(____));
printf("hizalama: %zu
", (size_t)_Alignof(int));
Açıklama: _Alignof(int) int hizalamasını verir.