2010-06-25 20 views

cevap

15

Hayır - Statik yöntemlere geçişin bellek üzerinde bir etkisi yoktur.

İlk kez bir tür başvurulan (statik veya statik olmayan), herhangi bir statik üye başlatılır ve statik kurucular çalıştırılır. Ancak, yalnızca statik olmayandan statik yöntemlere geçiş yapmayı düşünüyorsanız, bunun çöp toplama veya toplam bellek izi üzerinde hiçbir etkisi olmayacaktır.

Sınıf üyelerini statik üyeler olarak değiştirirseniz, bellek izi değiştiğinden endişe etmelisiniz. Bu durumda, tür erişildikten sonra statik alanlar köklü kalır ve GC tarafından toplanmaz. Bu, genellikle gerektiğinde yapılır ve tasarım gereği, bir üyeyi statik yaparsınız, çünkü bunu sürdürmek istersiniz.

+0

Bellekte herhangi bir yerde saklanan statik yöntemin bir kopyası var mı? Benim varsayım, statik bir yöntemi referansladığınız zaman, bir yerde saklanacaktı ve sonradan her bir referans, bu yöntemin örneğini kullanacaktı, fakat bu varsayımın yanlış olabileceğini anladım. –

+3

Statik veya örnek metotları olsun, "Yöntemler", süreç alanına getirildiklerinde ve JIT tarafından derlendiklerinde belleğe bir kez yüklenirler. Statik ve statik olmayan arasında yöntem kullanımında gerçekten bir fark yoktur. Statik yöntemlerin özel durumunuza uygun olup olmadığına odaklanın ve bir yöntemin statik mi yoksa örnek bir yöntem mi olduğunu belirlemek için bunu kullanın. –

+0

Bellekte çok küçük bir etki var - bu "işaretçiyi" kullanmayan yöntemlere aktarmak için ekstra kod üretildiğinden. – Qwertie

7

JIT derleyicinin bakış açısından, statik ve örnek yöntemi arasında fark yoktur. Onlar için makine kodu çok benzer, aynı tür yığın içinde saklanır. Tek fark, bir örnek yönteminin ek bir argümana sahip olmasıdır. Metot çağrıldığında bu fazladan argümanın geçirilmesi gerekir. Bu fazladan bir makine kodu talimatına mal olabilir, ancak bu sık sık değil. CPU yazmacı (ECX) sıklıkla doğru değere sahiptir. Bir örnek yönteminin x86 üzerinde birden fazla bağımsız değişkeni varsa veya x64'te üçten fazla olması durumunda, bir CPU kayıtçısından ziyade yığında ekstra bir bağımsız değişken geçirilmesi gereken bir fark vardır. Bir ekstra talimat.

En kötü durum, bir nanosaniyeden biraz daha az bakıyorsunuz. Bu, mikro optimizasyonlarla olağan problemi ölçmek zor olacak.

+0

Bu, asıl sorunun kapsamının ötesine geçebilir, ancak statik, metot veya yöntem kullanılmadığında yığında ne saklanır? Sadece yöntemin kendisi mi, metodu içeren sınıfın bir örneği mi yoksa tamamen başka bir şey mi? Bu bellek hiç çöp toplama tarafından toplanmış mı? –

+0

Yöntem çağrısı sırasında hiçbir şey yığınta saklanamaz. Bağımsız değişkenler CPU kayıtlarından ve yığından geçirilir. Hiçbir şeyin toplanması gerekmiyor. Petzold'un kitabı "Code" sizi ilgilendirebilir. –

+0

Tamam, bu çok mantıklı. Öyleyse, yöntemlerimi statik olmayandan statik hale getirmenin tek nedeni, sınıfsal bir örnekleme olmadan bunlara erişmek olabilir mi? Tavsiyen için teşekkürler. –