2013-03-18 15 views
9

calloc()'un malloc'a ve ardından memset'a tercih edilip edilmediğini merak ediyordum. Bu ikinci bellek ayırma ve başlatma en yaygın yolu olarak görünüyor.Malloc() ve memset() yerine calloc() kullanmanın herhangi bir avantajı var mı?

A github code search, birçok calloc test ve uygulamasına katlanmakla birlikte, ilk sayfa numarasında hiçbir kod aslında calloc kullanmamaktadır.

calloc numaralı telefonu kullanan veya öneren herhangi bir proje/kuruluş hakkında bilgi sahibi olan ve önerdiği koşullar hangisi?

görüş ve aşağıdaki yanıtları itibaren

, burada bazı şimdiye kadar sahip düşünceler ortaya çıkıyor açıklanmıştır:

  • calloc(n, size)malloc(n * size)

  • malloc ve memset birleştirerek ile mümkündür taşma önleyebilircalloc, sıfırlanmış olduğu bilinen bir sayfa isteme şansı verir.

  • bir dezavantaj

    birleşik adımlar malloc'dan etrafında diğer sarma engelleyebilir callociçin.

+2

Hiç kimsenin onu kullanması konusunda hiç bir şey bilmiyordu ve ben de onun varlığından haberdar olmasına rağmen hiç kullanmadım. Nedenini bilmiyorum ama sadece C. – Dave

+5

gibi hissetmiyor. 'Malloc()' ve onu takip et 'memset() '' calloc() 'dan daha yavaş olması garantilidir. –

+0

GitHub'u "malloc" için ararsanız, kullanımdan önce de uygulama ve test kodunu bulabilirsiniz. –

cevap

14

Oldukça biraz C kodunda calloc kullanıyorum, bu yüzden bir cevap. Ben biraz sıradışı çağrı yöntemi (elemanların sayısı ve öğe boyutu) insanları atabilir düşünüyorum. Ancak, beklediğiniz gibi çok fazla çağrı görememenizin nedenlerinden biri de, daha büyük sayıda projenin, sargıları malloc, calloc ve bellek ayırma hatası üzerinde hata işleme (genellikle programı sonlandıran) kullanan arkadaşlar kullanmasıdır. Yani gerçek kod yerine xcalloc kullanır.

malloc ve memset üzerinden calloc kullanımının bir nedeni, calloc'un daha verimli olabileceğidir. C kütüphanesi bir sayfanın sıfırlandığını zaten biliyorsa (belki de işletim sisteminden yeni sıfırlanmış bellek aldı), bunu açıkça sıfırlamak zorunda kalmaz.