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>
2
3struct Bad {
4char a; // 1 bayt
5int b; // 4 bayt (padding: 3 bayt)
6char c; // 1 bayt
7double d; // 8 bayt (padding: 7 bayt)
8};
9
10struct Good {
11double d; // 8 bayt
12int b; // 4 bayt
13char a; // 1 bayt
14char c; // 1 bayt (padding: 2 bayt)
15};
16
17int 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 bayt
2Good struct: 16 bayt

Aynı 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.

Reklam · TEST
AdSense Test ReklamıYazı arası (gönderi içi) · Yazı arası

Çö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));
7
8int 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.

Reklam · TEST
AdSense Test ReklamıGönderi altı · Görüntülü
konu hakkında tepkinizi verebilirsiniz