SORU
3 Ocak 2009, CUMARTESİ


Yığın, Statik, ve C Öbek

Aradım, ama çok iyi üç kavram anlamadım. Dinamik ayırma (yığın) kullanmak zorunda mıyım ve gerçek avantajı nedir? Statik sorunları ve yığın nedir? Yığın değişkenleri ayırmadan bütün bir uygulama yazabilir miyim?

Diğer diller dahil olduğunu duydum bir "toplayıcı bellek hakkında endişelenmenize gerek yok. çöp Çöp toplayıcı ne yapar?

Bu çöp toplayıcı kullanarak yapamayacağını Kendin hafıza manipülasyonu ne olabilir?

Bir kez birisi bu bildirgeyle: o bana söyledi

int * asafe=new int;

Bir ben var "bir işaretçi işaretçi". Bu ne anlama geliyor? Farklı:

asafe=new int;

?

CEVAP
3 Ocak 2009, CUMARTESİ


A similar question istendi, ama statiği hakkında sormak gelmedi.

Ne statik, yığın, yığın bellek özeti:

  • Statik bir değişken erişim küresel yapamıyorsanız bile temelde küresel bir değişkendir. Genellikle çalıştırılabilir dosyanın kendisi olduğu için bir adres var. Programın tamamı için yalnızca bir kopyası vardır. Bir işlev çağrısı (veya sınıf) (ve kaç iş parçacığı!) girmeden nasıl olursa olsun değişkeni ile aynı bellek konumuna dir.

  • Yığın dinamik olarak kullanılabilecek hafıza diye bir şey yoktur. Eğer bir nesne için 4kb sonra isterseniz dinamik ayırıcı yığın boş alan listesi üzerinden bakmak, 4kb bir parça seçin, size verecektir. Genellikle, Dinamik Bellek ayırıcısı (malloc, c yeni et.) bellek ve çalışmalar sonunda başlar geriye.

  • Bir yığın büyür ve küçülür açıklayan bu cevap kapsamı dışında biraz, ama sen her zaman ki Ekle ve kaldır sonunda sadece o yeterli. Yığınlar genellikle yüksek başlangıç ve adresleri alt uzar. Yığının ortasında bir yerlerde dinamik ayırıcısı (ama sanal bellek ve fiziksel parçalanma karşı bakın) ile karşılaştığı zaman, bellek tükendi. Birden çok iş parçacığı birden fazla yığınları (bu işlem genellikle yığın için minimum bir boyut rezerv) gerektirir.

Her birini kullanmak istiyorsanız:

  • Statik/bütünsel hep ayırması istemediğini biliyorsun ve biliyorsun ki hafıza için yararlıdır. (Bu arada, gömülü ortamlar sadece statik hafıza kapasitesine sahip... ... yığını olarak düşünülebilir ve öbek adresi üçüncü bir bellek türü tarafından paylaşılan uzay parçası: program kodu. Programlar genellikle bağlantılı listeler gibi şeylere ihtiyaçları olduğunda kendi statik bellek dinamik tahsisat yapar. Ama ne olursa olsun, kendisi statik bellek (buffer) kendisini", daha ziyade diğer nesneleri bellek bu amaç için. tampon tarafından düzenlenen kaynak" tahsis değildir Yapabilirsiniz olmayan gömülü ve konsol oyunları sık kaçının dahili dinamik hafıza mekanizmaları lehine sıkı bir şekilde kontrol ayırma işlemi kullanarak tamponlar önceden belirlenmiş boyutları için tüm ayırmaları.)

  • Yığın değişkenleri fonksiyon kapsamı (bir yere yığın üzerinde) olduğu sürece, değişkenler kalmak isteyeceksiniz nereye ve ne için yararlıdır. Yığınları kodu dışında bulundukları kodu için gereken, ama gerekli değil hangi değişkenler için güzel. Ayrıca bir kaynağa erişirken için çok güzel bir dosya gibidir, ve bu kod size ayrılan kaynak otomatik olarak gitmesini istiyorum.

  • Yığın ayırma (dinamik olarak ayrılan bellek) yukarıda daha fazla esnek olmak istediğinizde kullanışlıdır. Sık sık, bir fonksiyon (kullanıcı, "kutu" düğmesi).. tıklama bir olaya tepki vermek için çağrılır Bunun cevabı uzun işlevi yığında olamaz, bu kadar heyecanlanma, sonra buralarda yeni bir nesne (yeni Kutusunda bir nesne) ayırmak gerekebilir. Ama kaç tane statik olamaz yani programın başında isteyeceğini bilmiyorsun.

Çöp Toplama

Son zamanlarda ne kadar büyük Çöp Toplayıcıları duymuştum, belki de muhalif bir ses biraz yararı olur.

Çöp Toplama performansı büyük bir sorun olmadığı durumlar için harika bir mekanizmadır. GCs daha iyi ve daha sofistike alıyorsanız duyuyorum, ama gerçek şu ki, bir başarım (kullanımı üzerine dava olarak kabul etmek zorunda kalabilirsiniz. Ve eğer tembel iseniz, hala düzgün çalışmayabilir. En iyi zamanlarda, Çöp toplayıcı belleği (reference counting) Daha fazla başvuru olduğunu anlarsa uzaklaşır farkında. Ama, eğer kendisi için başvuran bir nesne varsa (geri anlamına gelir başka bir nesne söz konusu muhtemelen), sonra başvuru yalnız sayım hafızası silinmiş olabilir. Bu durumda, GC sadece kendileri tarafından başvurulan herhangi bir ada var, eğer orada tüm başvuru çorba bakıp anlamaya ihtiyacı var. Hazırlıksız, o(n^2) Ey bir operasyon olacağını tahmin ediyorum, ama ne olursa olsun, eğer performans konusunda endişeleriniz varsa kötü olabilir. (Edit: Martin B(n) oldukça verimli algoritmalar için O O points out. Hala O(n) ise performans ile ilgili çok fazla olduğu ve çöp toplama olmadan sürekli zaman ayırması olabilir.)

İnsanlar C çöp toplama yoktur demek duyduğumda şahsen fikrimi C bir özellik olarak etiketler , ama muhtemelen azınlık içindeyim. İnsanlar C ve C işaretçileri ve doğru dinamik hafıza ayırma işlemek için nasıl programlama hakkında bilgi edinmek için belki de en zor şey. Başka bir dil, Python gibi bir dil istiyorum ne yapmaliyim sence bu kadar GC olmadan korkunç olurdu. Eğer güvenilir performans istiyorsanız, çöp toplama olmadan C tek şey aklıma gelen Fortran bu tarafında. Eğer kullanım kolaylığı ve tekerlekler (öğrenmek gerek kalmadan çökmesini kaydetmek için "" hafıza yönetimi), GC ile uygun bir şey seç. eğitim istiyorsanız Eğer bellek yönetmek için nasıl biliyorsanız bile, başka bir kod optimize geçirebilirsiniz zaman kazandıracak. Orada gerçekten değil çok da iyi bir performans ceza artık, ama eğer gerçekten ihtiyacınız güvenilir performans ve yetenek olduğunu tam olarak ne oluyor, ne zaman, yorganın altında) ederim sopayla C . Duyduğum her büyük oyun motoru C (C veya derleme) bir nedeni var. Python, ve ark betik, ama ana oyun motoru olmaz.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Austin Evans

    Austin Evans

    5 AĞUSTOS 2007
  • Kevin Bruckert

    Kevin Brucke

    30 Aralık 2006
  • Nightmare2005

    Nightmare200

    14 Ocak 2007