Span<T> İncelemesi
- hacer_bakirci
- Apr 27, 2021
- 2 min read
Updated: Oct 11, 2024

Span C# 7.2 ile birlikte yeni bir value type (struct) olarak karşımıza çıkıyor ve bellekten tasarruf noktasında başvurabileceğimiz bir yöntem sağlıyor.
.Net Core ile kullanabileceğimiz bu yapıyı biraz irdeleyelim.
Span'in value type olması dolayısıyla muhatabımız, belleğin stack bölgesi.
Burada yüzeysel bir back to basics yapacak olursak (ayrıdan daha ayrıntılı bir back to basics konseptli yazı olabilir); bellekten serbest bırakma işini Garbage Collector'e bıraktığımız kod "Managed" kod oluyor. Bir de GB 'ın kontrol etmediği "Unmanaged" kod tarafı var. Unmanaged kod bellek yönetiminin bizim tarafımızdan yapıldığı koddur.
Belleğin stack bölgesinde yer ayırma veya serbest bırakma (allocation-deallocation) olayları çok daha hızlıdır. Hatta bu şekilde Garbage Collector'un yükünü de azaltmış oluruz.
Normalde bir array oluşturduğumuzda belleğin heap bölgesinde yer ayrılır (managed). Bu array'i stack bölgesinde tutmak istediğimizde unmanaged kod'a başvurmamız yani "stackalloc" keyword'ünü kullanmamız gerekiyor.
Span'in bizlere sağladığı yapı ise, stack veya heap bölgelerinde oluşturduğumuz array üzerinden, bellekte ekstra bir yer ayırmadan, unmanaged kod yazmadan istediğimiz bir bölümünü refere edip o bölümde işlem yapabilmektir.
Span ile hem heap hem de stack bölgesine erişebildiğimiz için farklı metotlar yazmadan, memory de yeni bir allocation'a gerek kalmadan array üzerinden işlem yapabiliyoruz. Bu da performans anlamında önemli bir kazanç sağlıyor.
Span'i aslında belleğin belirli bir görüntüsü olarak kabul edebiliriz. Bir array'in istediğimiz kadar alanını görebiliriz.
Örneğin elimizde şöyle bir array olsun;

Bu array üzerinden bir span oluşturmak için yapmamız gereken :

Artık oluşturduğumuz span üzerinden memory'deki değerlere ulaşmamız ve hatta değerleri direkt değiştirmemiz mümkün ;

Ayrıca array üzerinden sadece istediğimiz kadarı ile de Span oluşturabiliyoruz;


Eğer elimizde array'in referansı değil de zaten o array üzerinden yaratılan bir span varsa bu span üzerindeki "Slice" metodunu kullanarak başka bir span oluşturabiliriz.


Span <T>, dizilerin performansını sürdürürken belleğe type-safe erişim sağlar.
Çok kullanışlıdır çünkü belleğin bir kısmını bölüp, immutable tiplerdeki gibi mevcut veriyi tekrar kopyalayıp bellekte yeni bir allocation yapmadan yönetebiliyoruz.
Dezavantaj diyebileceğimiz durumlar da, Span'ın struct olması ve IEnumerable'dan katılım almıyor olması. Bu sebepten IEnumerable'ın sağladığı esnekleklikleri (Linq) Span üzerinde kullanamayacağız. Kendisinin de fazla metodu bulunmamaktadır.
Comments