2009-10-25 42 views
5

Değişkeni her zaman iyi çalışacak en küçük boyuta kullanmayı seviyorum. Ama tamsayı yerine kısa bayt tamsayıları kullanırsam ve bu bellek 32bit kelimeyi kullanabiliyorsam bu gerçekten kazançlı olur. Derleyici geliştirilecek bir şey yapar mı? hafıza kullanımı ?Neden 32bit'den küçük tamsayıları kullanıyorsunuz?

cevap

11

Yerel değişkenler için, muhtemelen çok fazla anlam ifade etmiyor, ancak binlerce veya milyonlarca öğeye sahip olduğunuz yapılarda daha küçük tamsayılar kullanarak, önemli miktarda bellek tasarrufu sağlayabilirsiniz.

+1

FWIW, 32-bit kipte bir PC'de, 16 bitlik bitler aslında 32-bit ints'den daha yavaş olabilir, çünkü makine opcodes'ları aslında 16 bit işlenenlerini belirtmek için fazladan bir bayta ihtiyaç duyarlar. Bu nedenle, yerel değişkenler sizin için çalışıyorsa yerel int türünü kullanır. Yine, yapılar için, bellekten tasarruf etmek için, en küçük boyuttaki işler ne olursa olsun kullanın. Üye değişkenleri, boyutlara göre gruplamak isteyebilirsiniz, böylece farklı büyüklükte üye değişkenleri arasında dolgu ile boşluk harcamazsınız. – Adisak

+1

BTW, burada 'C# Mastering Structs in C#' adlı makaleyi derinlemesine açıklıyor * EXACTLY * gibi büyüklükteki değişkenleri gruplama hakkında ne diyordum: http://www.vsj.co.uk/articles/display.asp?id= 501 – Adisak

+0

Bağlantıyı çok beğendim, çok bilgilendirici ve bilmek istiyorum, Dizilerle benzer bir kazanım elde edeceğim, Yapılar gibi bir şey olacak mı? –

4

Hayır, int kısa (short, sbyte) türleri sayesinde sadece mal olacak performansını kullanarak, mopdern 32/64 bit mimarileri için en hızlı int türü için seçildi.

Bazen büyük miktarlarda veya listelerde bellekte kayıt yapabilirsiniz. Ve o zaman bile genellikle ödeme yapmaz. 8 bit ile

Hesaplama:

sbyte a, b, c; 
a = (sbyte) (b + c); 

kalıplaştığı gerekli bir çalışma zamanı maliyeti taşır.

+0

Aşağı oylama ile ilgili herhangi bir yorumunuz var mı? –

+2

Ama biz x86 üzerinde (doğrudan) koşmayız. Her hesaplama için C# bayt ve şort genişler. –

+0

BTW, Size oy vermedim ya da oy vermedim .... Sadece yorum yapıyorum ... ama reddedilme hakkındaki tahminim, cevabın performans iddialarında tamamen doğru olmadığıdır. Ayrıca, sadece dizilerde veya listelerde olmayan yapılara çok sayıda bellek kaydedebilirsiniz. Örneğin, büyük bir 3D dünyası olan oyunlarda, tam anlamıyla bir grafikle (oyunlarımızdan biri 200.000 nesne yükler) gevşekçe bağlanmış onlarca veya yüz binlerce nesneye sahip oyunlar üzerinde çalışıyoruz.Değişken boyutlar, performans ve hafıza için gerçekten önemli. – Adisak

3

Düz bir değişkense, daha kısa bir genişlik kullanılarak hiçbir şey elde edilmez ve bazı performans kaybedilebilir. Derleyici, depolamayı otomatik olarak tam işlemci sözcüğüne genişletir, böylece yalnızca 16 bit bildirseniz bile, yığında 32 bit alır. Ayrıca, derleyici, bazı durumlarda belirli bir kesme işlemi gerçekleştirebilir (örneğin, alan bir yapının parçası olduğunda); Bunlar hafif bir ek yüke neden olabilir.

Gerçekten yalnızca yapılar ve diziler için önemlidir, yani çok sayıda değeriniz varsa. Bir yapı için, yukarıda bahsettiğim ek yük pahasına bir miktar hafıza kaydedebilirsiniz. Ayrıca, yapının bazı harici düzenleri takip etmesi gerekiyorsa daha küçük bir boyut kullanmak zorunda kalabilirsiniz. Bir dizi için, dizi büyükse, bellek tasarrufu uygun olabilir.

3

Normal olarak, diğer cevaplar ek olarak int vb

sopa ile; Ayrıca, sadece verilen veri boyutunu bilerek isteyerek desteklemek istediğiniz durumlar da vardır, çünkü verilerle ilgili bazı önemli gerçekleri temsil eder. Bu, harici sistemlerle (özellikle birlikte, ama aynı zamanda veri tabanları, dosya formatları, vb.) Konuşurken anahtar olabilir ve taşmaları olabildiğince erken tespit etmek için checked aritmetiği ile karıştırılabilir.

2

Dürüst bellek tüketimi, büyük olasılıkla küçük mürekkepleri kullanmanın en zorlayıcı sebebi değildir (bu örnekte). Ama evet diyor ki, veri yapılarınız için gerekli olan belleği kullanmalısınız.

Bu, yalnızca verilerinizin gerektirdiği genişliği tahsis eder ve derleyicinin oluşabilecek taşma hatalarını bulmasına izin verir, bunun çok etkili olan ek bir hata ayıklama tekniği vardır. Eğer 'u biliyorsanız, bir değerin hiçbir zaman bir eşiği geçmemesi gerektiğini unutmayın, o zaman sadece bu eşiğe kadar tahsis edin.

İlgili konular