Özet - Unsafe kod
unsafe, fixed ve Span<T>'yi birleştirerek hızlı bir arabellek kopyalama yazarsın.
Özet - Unsafe kod
Bu grupta unsafe blokları, işaretçileri (int*), fixed ile sabitlemeyi, stackalloc ile yığın tahsisini ve Span<T>'yi öğrendin.
Bu araçlar performansın kritik olduğu yerlerde kullanılır; günlük koda Span çoğu zaman unsafe'in yerini alır. Şimdi küçük bir arabellek kopyalama ve sabitleme örneği yazalım.
Uygulama Span ile arabellek kopyala
Span<int> src = stackalloc int[3]; ile 3 int ayır. src[0] = 1; src[1] = 2; src[2] = 3; ata. Span<int> dst = stackalloc int[3]; ile hedef ayır. src.CopyTo(dst); ile kopyala, Console.WriteLine(dst[2]); ile son elemanı yazdır.
Örnek çözümü göster
Span<int> src = stackalloc int[3]; src[0] = 1; src[1] = 2; src[2] = 3; Span<int> dst = stackalloc int[3]; src.CopyTo(dst); Console.WriteLine(dst[2]);
Örnek çözüm:
using System;
class Program
{
static void Main()
{
Span<int> src = stackalloc int[3];
src[0] = 1; src[1] = 2; src[2] = 3;
Span<int> dst = stackalloc int[3];
src.CopyTo(dst);
Console.WriteLine(dst[2]);
}
}
unsafe ve Span birlikte
unsafe hâlâ gerektiğinde fixed ile Span'den işaretçi alınabilir: fixed (int* p = &span[0]). Yani Span güvenli taraf, unsafe esnek taraf.
Doğru tasarım: önce Span dene, yetersizse unsafe'e geç. Bu, çoğu yüksek performanslı senaryoyu güvenli biçimde çözer ve hata riskini düşürür.
Uygulama fixed ile ikinci elemanı yazdır
Main'i unsafe yap. int[] arr = { 7, 14 }; tanımla. fixed (int* p = &arr[0]) bloğu içinde Console.WriteLine(*(p + 1)); ile ikinci elemanı yazdır.
Örnek çözümü göster
unsafe static void Main() { int[] arr = {7,14}; fixed (int* p = &arr[0]) { Console.WriteLine(*(p + 1)); } }
Örnek çözüm:
using System;
class Program
{
unsafe static void Main()
{
int[] arr = { 7, 14 };
fixed (int* p = &arr[0])
{
Console.WriteLine(*(p + 1));
}
}
}
Kendini test et
-
Hangisi unsafe gerektirmeden yığın tahsisi sağlar?
- new int[4]
- stackalloc int[4] (Span ile)
- GC.Allocate
- fixed int[4]
Cevabı göster
stackalloc int[4] (Span ile) — Doğru. Span'a atanan stackalloc unsafe gerektirmez.
-
Kavramları eşleştir
- unsafe
- İşaretçi izni
- int*
- int işaretçi
- fixed
- Sabitleme
- Span<T>
- Güvenli görünüm