2010-03-16 34 views
6

Diyelim ki, varsayımsal olarak (şunu okuyun: Aslında buna ihtiyacım olduğunu düşünmüyorum, ama kafamın içine atılmış bir fikir olarak merak ediyorum), biri yığında değil, yığın üzerinde yerel olarak ayrılmış bir dizi bellek istedi. Örneğin, böyle bir şey: Ben cevabı tahmin ediyorumC# kümesinde yığın tabanlı diziler var mı?

private void someFunction() 
{ 
    int[20] stackArray; //C style; I know the size and it's set in stone 
} 

hayırdır. Tüm bulabildiğim yığın tabanlı diziler. Birisi buna ihtiyacım varsa, herhangi bir geçici çözüm var mı? Belirli bir sıralı bellek miktarını "değer türü" şeklinde ayırmanın bir yolu var mı? Veya adlandırılan parametrelerle tek yönlü yapılar var (XNA'da Matrix struct'un 16 parametresi (M11-M44) olduğu gibi)?

cevap

4

İstediğinizi stackalloc; Maalesef, bunu yalnızca güvenli olmayan kodda kullanabilirsiniz, yani sınırlı bir izin kapsamında çalışmayacaktır.

Ayrıca her öğe türü için içinde değişkenlerin gerekli sayı ile bir yapı oluşturabilir, ancak 'dizisinin' her boyutu için yeni bir tür gerekir Eğer elimden

+0

Hm, ilkel bir BağlantılıListeden ne haber? Aynı türdeki bir önceki/sonraki yapınızdaki struct setinizde ... ICollection semantiklerini alamazsınız, ancak IEnumerable için yeterli olabilir ... – flq

+0

Cevabınız için teşekkürler. Evet, struct tabanlı LinkedLists mümkün mü? Ve .NET'te neden güvenli yığın tabanlı bir dizi seçeneği bulunmadığına dair bir fikriniz var mı? – Bob

+0

@Frank: Bunu yapamazsınız - özyinelemeli bir yapı derlemeye çalıştığımda, bir 'CS0523: Yapı üyesi yapı düzeninde bir döngüye neden olur' – thecoop

0

yakın şey kullanmak istedi yığın tabanlı bir diziyi düşünmek, elle yuvalanmış bir yapı olacaktır; N^M büyüklüğü için kod boyutu O (MN) ve erişim zamanı O (M) olacaktır; biri M ve N'yi uygun şekilde ölçekleyebilir (örneğin, biri 4096 elemanlı diziyi altı derinlikli yuvalanmış 4 elemanlı yapılar, dört derinlikli yuvalanmış 8 elemanlı yapılar veya üç derinlikli iç içe 16 elemanlı yapılar, iki derin yuvalanmış olarak ele alabilir 64 elemanlı yapılar, vb.) Eğer 16 elemanlı dizilerin üç derinlikli bir şekilde yerleştirilmesi istendiyse (muhtemelen en pratik dış ticaret) biri, f0 ile f15 arasındaki alanları içeren 16 elemanlı bir yapı ve bir erişim metodu kullanılacaktır. Bir eleman seçmek için anahtar/kutu. Daha sonra bunlardan 16-elemanlı bir yapı, bunların 16-elemanlı bir yapısı, vb. Tanımlanabilir.

Genel olarak, standart bir dizi kullanmak, dizileri taklit etmek için değer tipi yapıları kullanmaktan daha iyidir. bir değer tipi olarak bir dizi-ish şeyine sahip olmanın avantajlı olduğu zamanlardır. Bununla birlikte, değer tipi dizilerin avantajları .net ile sınırlı olmaya eğilimlidir, bununla birlikte, referans ile değer tiplerinin manipüle edilmesindeki bazı sınırlamalar ile. "MyArrayishThing [1] [2] [3]" yazarak yukarıdaki gibi tanımlanan bir diziden 0x123 elemanına basitçe erişebilseydik hoş olurdu, bu da yazım için verimsiz ve yazı için etkisiz olurdu (çünkü alt-ifade MyArrayishThing [1] ] dizinin 256 elemanını tutan yapıların bir kopyasını yapar). Bunun yerine, gerekli olan şey, MyArrayishThing [1] 'i, bunun 2 nolu öğeye erişebilen ve bunun bir erişim elemanına 3 bir rutine atıfta bulunabilen bir rutine atıfta bulunmaktır. Bunu verimli bir şekilde yapmak mümkün, ancak kod oldukça kötü görünüyor.

İlgili konular