SORU
6 Kasım 2011, Pazar


Neden malloc gcc 0 değerleri başlatılamıyor?

Belki platform platform farklıdır, ama

ben gcc kullanarak derleme ve aşağıdaki kodu çalıştırın, benim ubuntu 11.10 0 her zaman olsun.

#include <stdio.h>
#include <stdlib.h>

int main()
{
    double *a = (double*) malloc(sizeof(double)*100)
    printf("%f", *a);
}

Neden calloc bile olsa böyle davranmasına malloc?

Sadece bazen kalmak istemezsin bile değerlerini 0 olarak başlatmak için istenmeyen bir performans yükü olması lazım değil mi?


EDİT: Oh, benim önceki örnek değil initiazling, ama "" blok. taze kullanmak oldu

Ben büyük bir blok ayırır: tam olarak başlatır neden arıyordu

int main()
{
    int *a = (int*) malloc(sizeof(int)*200000);
    a[10] = 3;
    printf("%d", *(a 10));

    free(a);

    a = (double*) malloc(sizeof(double)*200000);
    printf("%d", *(a 10));
}

OUTPUT: 3
        0 (initialized)

Ama GÜVENLİK nedeni olduğunu belirttiğin için teşekkürler mallocing zaman! (Bunu hiç düşünmemiştim). Emin taze blok veya büyük bir blok ayrılırken sıfır başlatmak için vardır.

CEVAP
6 Kasım 2011, Pazar


Kısa Cevap:

Bence senin durumunda sıfır olur değil.
(Ayrıca test verileri sıfır. olduğunu göstermiyor Bu sadece bir eleman sıfır ise gösterir.)


Uzun Cevap:

Çağırdığınızda malloc(), iki şeyden biri olacak:

  1. Önceki ve aynı işlem ayrılan bırakılmış bellek geri kazandırıyor.
  2. İşletim sisteminden yeni sayfa(lar) istekleri.

İlk durumda, bellek ayırmalarını önceki veri artıkları içerir. Sıfır olmayacak. Bu küçük bir ayırma yaparken olağan bir durumdur.

İkinci durumda, hafıza işletim sistemi olacak. Bu program belleği yetersiz - ya da çok büyük bir tahsisat isteme ne olur. sizin örnekte olduğu gibi)

Ama şöyle bir durum var:Bellek OS gelen sıfırlanmış olacakgüvenliknedenleri*.

İşletim sistemi bellek verdiğinde, farklı bir işlem kurtulmuş olabilirdi. Bellek bir şifre gibi hassas bilgileri içerebilir. Bu yüzden bu tür veri okuma önlemek için, işletim sistemi sana verir önce sıfır olacak.

*C standardı bu konuda bir şey söylüyor unutmayın. Bu kesinlikle OS bir davranıştır. Bu sıfırlama olabilir ya da bir güvenlik sorunu değil, Sistemde mevcut olmayabilir.


Bu performans için bir arka plan vermek için:

@R. yorumlar bahseder gibi, bu sıfırlama her zaman 10* *etmelisiniz. calloc() memset() bir ayrı önlemek için bu gerçeği yararlanmak.


Öte yandan, bu sıfırlama bazen performans düşüklüğü. Bazı sayısal uygulamalar (out-of-place FFT), çizik hafızanın büyük bir kısmını ayırmak gerekiyor. Ne olursa olsun algoritma gerçekleştirmek, ücretsiz kullanın.

Bu durumda, sıfırlama gereksiz ve saf yükü tutarlar.

Gördüğüm en uç örnek 48 GB sıfırdan bir tampon ile 70-ikinci bir operasyon için 20 saniye sıfırlama bir tepede. (Yaklaşık 30% Tepegöz.) (Verilen: makine bellek bant genişliği eksikliği vardı.)

Bariz çözüm sadece hafıza el ile yeniden. Ama sık sık kurulan arabirimleri kırarak gerektirir. özellikle kütüphane rutin bir parçası

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • bombjack2991

    bombjack2991

    29 HAZİRAN 2008
  • Gigawipf

    Gigawipf

    18 ŞUBAT 2010
  • kidrauhl

    kidrauhl

    15 Ocak 2007