Struct Padding ve Alignment: Bellek Düzeni Optimizasyonu
Struct'lar bellekte sırayla depolanmaz. İşlemci, veri türlerine göre hizalama (alignment) yapar ve boş alanlar (padding) oluşur. Bu, beklenmedik bellek israfına yol açar.
Örneğin, 1 baytlık char'ı 4 baytlık int'ten önce yazarsanız, işlemci int'i hizalamak için 3 bayt boş yer ekler. Bunu görelim:
1#include <stdio.h>23struct Bad {4char a; // 1 bayt5int b; // 4 bayt (padding: 3 bayt)6char c; // 1 bayt7double d; // 8 bayt (padding: 7 bayt)8};910struct Good {11double d; // 8 bayt12int b; // 4 bayt13char a; // 1 bayt14char c; // 1 bayt (padding: 2 bayt)15};1617int main() {18printf("Bad struct: %zu bayt\n", sizeof(struct Bad));19printf("Good struct: %zu bayt\n", sizeof(struct Good));20return 0;21}Beklenen çıktı:
1Bad struct: 24 bayt2Good struct: 16 baytAynı veriler, farklı sıralamada 8 bayt tasarruf! Büyük veri yapılarında bu fark milyonlarca bayta çıkabilir.
Neden olur? İşlemci, her türün kendi boyutuna göre hizalanmasını ister. 4 baytlık int, 4'ün katı olan adresler üzerinde başlamalı. Eğer öncesinde 1 baytlık char varsa, işlemci 3 bayt atlar.
Çözüm: Büyükten küçüğe sıralayın. Double (8), int (4), char (1) şeklinde. Ya da `__attribute__((packed))` kullanın (ama performans cezası olabilir):
1struct Packed {2char a;3int b;4char c;5double d;6} __attribute__((packed));78int main() {9printf("Packed struct: %zu bayt\n", sizeof(struct Packed));10return 0;11}Çıktı: `Packed struct: 14 bayt` (ama hizalama kayıp, okuma yavaşlayabilir).
Sık yapılan hata: Veri türlerini rastgele sıralamak. Özellikle ağ protokolleri veya dosya formatlarında struct padding, veri kaybına neden olabilir. Padding'i hesaba katmadan dosyaya yazarsanız, okuması başarısız olur.
Büyük projeler için alignment'i kontrol etmek ve padding'i minimize etmek, bellek ve cache verimliliğini önemli ölçüde artırır.
0 yorum