Ana Sayfa

Go'da Hash Tabloları: Boş Struct Bellek Tasarrufu Sağlar mı?

1 dk okuma

Go dilinde set veri yapısı bulunmadığından, geliştiriciler genellikle benzersiz değerleri takip etmek için map[int]bool veya map[int]struct{} gibi hash tablolarını kullanır. Yaygın bir inanışa göre, struct{} boş bir tür olduğu ve teorik olarak sıfır bellek kapladığı için map[int]struct{} kullanmak önemli ölçüde bellek tasarrufu sağlar. Makalenin yazarı da bu beklentiyle üretimdeki bir uygulamada map[int]bool yapısını map[int]struct{} ile değiştirdiğinde, beklenen bellek tasarrufunun gerçekleşmediğini şaşkınlıkla fark etmiştir.

Bu durumun nedenini araştırırken, yazar Go 1.24 sürümüyle birlikte gelen ve genellikle daha az bellek tüketen Swiss Tables adlı yeni map implementasyonunu öğrenir. Ancak, hem Google aramaları hem de yapay zeka modelleri (LLM'ler) hala map[int]struct{} kullanımının bellek tasarrufu sağladığını iddia etmektedir. Bu çelişkiyi gidermek için yazar, Go'nun self-hosted compiler (derleyicinin kendi dilinde yazılmış olması) avantajını kullanarak map yapısının kaynak kodunu incelemeye karar verir. Bu yaklaşım, Python gibi dillerin C ile yazılmış karmaşık implementasyonlarına kıyasla Go'nun dahili işleyişini anlamayı kolaylaştırır.

İnceleme sonucunda, Go'daki her bir map elemanının (slot) key ve elem alanlarından oluştuğu görülür. key alanı 8 byte yer kaplarken, elem alanı struct{} olduğu için teorik olarak sıfır boyuttadır. Ancak Go derleyicisi, bir struct'ın son alanı sıfır boyutlu olduğunda, bellek hizalamasını sağlamak ve işaretçi aritmetiğiyle doğru referans verilebilmesi için bu alana 1 byte'lık bir dolgu (padding) ekler. Bu durum, map[int]struct{}'ın aslında map[int]bool'a göre bellek tasarrufu sağlamadığını, çünkü bool tipinin de 1 byte yer kapladığını ortaya koymuştur. Böylece, yaygın kanının aksine, bu özel durumda struct{} kullanmanın bellek optimizasyonu açısından bir fark yaratmadığı anlaşılmıştır.

İçgörü

Go'nun bellek yönetimi ve veri yapılarının dahili işleyişi, yaygın kanıların aksine beklenmedik sonuçlar doğurabilir.

Kaynak