| 
					
							
        
    
        
						
			 | 
			
			
					    
					
        
         
          
         
	
            | New - Malloc Fra : Michael Olsen | 
  Dato :  16-03-07 19:28 |  
  |   
            Hej.
 Hvornår er det nødvendigt at bruge New ell Malloc.
 Når man ikke kender størrelsen af pladsforbrug bruges det,
 men bruges det ved f.eks også 10 byte forbrug, eller er det over en vis
 størrelse det først bruges, i de bøger jeg har kigget i skrives der hvordan
 de bruges, men ikke hvornår.
 
 -- 
 Hilsen
 Michael Olsen
 
 
 
  
            
             |   |   
            
        
 
            
         
           Mogens Hansen (16-03-2007) 
         
	
            | Kommentar Fra : Mogens Hansen | 
  Dato :  16-03-07 20:16 |  
  |   
            
 "Michael Olsen" <michael@nospam.dkfritidmotorcykel.dk> wrote in message 
 news:45fae1ab$0$90274$14726298@news.sunsite.dk...
 > Hej.
 > Hvornår er det nødvendigt at bruge New ell Malloc.
 
 Det skrives med småt: "new" og "malloc".
 
 > Når man ikke kender størrelsen af pladsforbrug bruges det,
 > men bruges det ved f.eks også 10 byte forbrug, eller er det over en vis
 > størrelse det først bruges, i de bøger jeg har kigget i skrives der 
 > hvordan
 > de bruges, men ikke hvornår.
 
 Det bruges typisk når man ikke på forhånd ved hvor meget plads der skal 
 bruges.
 Det bruges når levetiden af objektet ikke følger eksekveringsflowet.
 Det bruges hvis man skal bruge _meget_ plads til en lokal variabel, idet 
 pladsen typisk ellers allokeres på kaldestakken der har begrænset størrelse.
 
 Når det er sagt, gør man sig selv en tjeneste ved ikke at benytte det så 
 hyppigt i C++.
 Ofte er man bedre tjent med at bruge klasser, der tager sig af hukommelses 
 styringen, så som "std::vector" og "std::string".
 
 -- 
 Venlig hilsen
 
 Mogens Hansen 
 
 
  
            
             |   |   
            
        
 
            
         
           Ukendt (24-03-2007) 
         
	
            | Kommentar Fra : Ukendt | 
  Dato :  24-03-07 16:10 |  
  |   
            > Når man ikke kender størrelsen af pladsforbrug bruges det,
 > men bruges det ved f.eks også 10 byte forbrug
 
 Nu kender jeg ikke helt dit niveau , så jeg plabrer bare løs !
 Here we go:
 
 Stak:
 Hvis du bare erklærerer en autovariabel i funktionen, ender den på stakken. 
 Faren ved dette er, at hvis alle funktioner gør dette, kan du risikere at 
 din stak løber over, og dermed har du katastrofen. Det kan være svært at 
 påvirke programmet sådan at du kan måle max stak forbruget. Dermed bliver 
 man nødt til at sætte den x %  større end det max målte stakforbrug.
 Hvis du gerne vil returnere en pointer til nogle data til en anden funktion, 
 så DUER DENNE METODE IKKE, idet stakken øjeblikket senere vil være 
 overskrevet.
 
 Heap
 Hvis du new'er / malloc'er, har du udfordringen med at kalde new og delete 
 præist lige mange gange , ellers har du en memory leak. Det lyder lettere 
 end det er, hvis programmet bliver rigtig stort og komplekst.
 Desuden har du udfordringen med at få testet at du håndterer at new/malloc 
 svarer failed alle mulige steder i koden. Det lyder også lettere end det er 
 i praksis.
 Jeg har hørt om folk der har lavet en wrapper til malloc funktionen, som 
 svarer failed i 1% af tilfældene på tilfældige tidspunkter, bare for at 
 teste om ens program kan finde på at crashe på den ondeste måde, eller bare 
 gå i en logisk baglås.
 
 Statisk
 Statiske buffere er også en muliged. Hvis du har et modul der altid skal 
 bruge to buffere til diverse formål gennem hele programmets levetid, kan du 
 erklære den på top niveau i c filen. Dermed vil de jo bare optage hukommelse 
 under  hele programmets forløb.
 Det svarer næsten til at malloce bufferne i init rutien og free dem igen når 
 programmet lukkes.
 På en embedded platform skal man dog huske, at malloc og free er funktioner 
 der optager kodeplads, og man skal reservere et helt område til Heap'en, så 
 der kommer en del overhead. Så i dette tilfælde kan man vælge bare at bruge 
 den statiske allokering. Så får man også at vide på linkningstidspunktet om 
 man har hukommelse nok.
 
 Konkret:
 Hvis du skal bruge en midlertidig buffer på 10 bytes, allokerer du den bare 
 som autovariabel.
 Hvis dette er noget data som du skal sende videre i systemet kan du vælge at 
 malloc'e bufferen, og lade det være op til andre dele af systemet at free'e 
 den.
 Grænsen er vel flydende, på en pc er det ok med lidt større buffere, på en 
 embedded platform skal man passe på ikke at bruge 100 bytes af stakken for 
 mange gange, hvis man kun har en stak på 256 bytes!
 
 Hvis du skal bruge store buffere, er malloc god stil.
 Jeg synes engang at jeg prøvede at bare skrive char myBuf[10000000] (10 
 meg). Det virkede sq ikke rigtigt , før jeg pænt bad windows om en sådan 
 buffer. Fandt aldrig helt ud af hvor grænsen er.
 
 (Godt med nogle posts i gruppen igen)
 
 tpt 
 
 
  
            
             |   |   
            
        
 
            
         
           Michael Olsen (26-03-2007) 
         
	
            | Kommentar Fra : Michael Olsen | 
  Dato :  26-03-07 20:18 |  
  |   
            > Hvis du skal bruge en midlertidig buffer på 10 bytes, allokerer du den 
 > bare som autovariabel.
 
 Disse 10 bytes, hvornår bliver de frigivet igen, er det når funktionen
 de er allokeret i afsluttes, eller er det operativ systemet der rydder op
 nå der er mangel på plads.
 
 
 -- 
 Hilsen
 Michael Olsen
 
 
  
            
             |   |   
            
        
 
            
         
            Mogens Hansen (26-03-2007) 
         
	
            | Kommentar Fra : Mogens Hansen | 
  Dato :  26-03-07 20:42 |  
  |   
            
 "Michael Olsen" <michael@nospam.dkfritidmotorcykel.dk> wrote in message 
 news:46081c65$0$90264$14726298@news.sunsite.dk...
 >> Hvis du skal bruge en midlertidig buffer på 10 bytes, allokerer du den 
 >> bare som autovariabel.
 >
 > Disse 10 bytes, hvornår bliver de frigivet igen, er det når funktionen
 > de er allokeret i afsluttes,
 
 Ja.
 Det typiske er at automatiske (lokale) variable bliver allokeret på CPU'en 
 kaldestak. Dermed bliver hukommelsen frigivet når funktionen afsluttes.
 Hvis man allokerer et objekt med constructor og destructor, vil 
 constructoren  blive eksekveret når variablen begynder at eksistere (kommer 
 ind i scope) og destructoren bliver eksekveret når variablen går ud af 
 scope.
 F.eks.
 void foo()
 {
     bar   b1; // bar default constuctor for b1 executes
 
    {
    bar  b2;  // bar default constructor for b2 executes
    }  // bar destrcutor for b2 executes
 
    bar    b3;  // default constructor for b3 executes
 
 } // bar destructor for b1 and b3 executes
 
 Det er dog ikke et krav at det fungerer sådan - men det er et krav at det 
 opfører sig sådan.
 
 Prøv at lav et lille program, der allokerer et objekt, som har en 
 constructor og destructor der skriver lidt ud, og kør det med en debugger.
 
 > eller er det operativ systemet der rydder op
 > nå der er mangel på plads.
 
 Nej - slet ikke.
 
 -- 
 Venlig hilsen
 
 Mogens Hansen 
 
 
  
            
             |   |   
            
        
 
            
         
             Ukendt (27-03-2007) 
         
	
            | Kommentar Fra : Ukendt | 
  Dato :  27-03-07 00:29 |  
  |   
            
>> eller er det operativ systemet der rydder op
 >> nå der er mangel på plads.
 >
 > Nej - slet ikke.
 >
 Det du foreslår er jo i realiteten en garbage collector.
 Det er ikke en del af standard C/C++, men du kan komme ret tæt på med Boost 
 libet (reference counting) . 
 http://www.boost.org/libs/smart_ptr/smart_ptr.htm
Svjv ryder den op i det øjeblik at der ikke er flere referencer til 
 objektet, istedet for Java' og C#'s ide med at gøre det når der er mangel på 
 plads. Det gør eksekveringstiden deterministisk.
 tpt
            
              |   |   
            
        
 
            
         
              Kent Friis (27-03-2007) 
         
	
            | Kommentar Fra : Kent Friis | 
  Dato :  27-03-07 16:11 |  
  |  
 
            Den Tue, 27 Mar 2007 01:28:39 +0200 skrev Troels Thomsen:
 >
 >>> eller er det operativ systemet der rydder op
 >>> nå der er mangel på plads.
 >>
 >> Nej - slet ikke.
 >>
 >
 > Det du foreslår er jo i realiteten en garbage collector.
 Nej, det er sådan stack'en fungerer.
 > Det er ikke en del af standard C/C++, men du kan komme ret tæt på med Boost 
 > libet (reference counting) . 
 >  http://www.boost.org/libs/smart_ptr/smart_ptr.htm
Garbage collection har ikke noget med stack'en at gøre.
 Mvh
 Kent
 -- 
 "So there I was surrounded by all these scary creatures
 They were even scarier than what Microsoft call features"
 - C64Mafia: Forbidden Forest (Don't Go Walking Slow).
            
              |   |   
            
        
 
            
         
               Ukendt (29-03-2007) 
         
	
            | Kommentar Fra : Ukendt | 
  Dato :  29-03-07 22:04 |  
  |   
            
 Prøv nu lige at læs indlægene igen med denne optik:
 Mogens svarer noget, som er helt enig i, og så tilføjer jeg et par ord til 
 MO.
 
 tpt
 
 
 
 
 
 
  
            
             |   |   
            
        
 
            
         
                Kent Friis (30-03-2007) 
         
	
            | Kommentar Fra : Kent Friis | 
  Dato :  30-03-07 15:53 |  
  |   
            Den Thu, 29 Mar 2007 23:03:59 +0200 skrev Troels Thomsen:
 >
 > Prøv nu lige at læs indlægene igen med denne optik:
 > Mogens svarer noget, som er helt enig i, og så tilføjer jeg et par ord til 
 > MO.
 
 Ja, tilføjer noget fuldstændig forkert.
 
 Der var intet i det Mogens skrev der havde noget med en garbage-
 collector at gøre.
 
 Mvh
 Kent
 -- 
 "So there I was surrounded by all these scary creatures
 They were even scarier than what Microsoft call features"
 - C64Mafia: Forbidden Forest (Don't Go Walking Slow).
  
            
             |   |   
            
        
 
            
         
                 Ukendt (31-03-2007) 
         
	
            | Kommentar Fra : Ukendt | 
  Dato :  31-03-07 15:47 |  
  |   
            
>
 > Der var intet i det Mogens skrev der havde noget med en garbage-
 > collector at gøre.
 >
 Du _vil_ ikke forstå ?
  
Som jeg skrev, var intet i mit indlæg møntet på Mogens. Jeg skulle måske 
 have trykket reply på Mikaels post istedet. Så havde det set således ud:
 >>> eller er det operativ systemet der rydder op
 >>> nå der er mangel på plads.
 >
 > Det du foreslår, er jo i realiteten en garbage collector.
 Det var MO's formulering " rydder op når der er mangel på plads." der 
 mindede mig om en garbage collector.
 Jeg tror vi er helt enige om hvordan stakken virker.
  
tpt
            
              |   |   
            
        
 
            
         
                  Mogens Hansen (31-03-2007) 
         
	
            | Kommentar Fra : Mogens Hansen | 
  Dato :  31-03-07 17:25 |  
  |   
            
"Troels Thomsen" <nej tak ...> wrote in message 
 news:460e7487$0$52199$edfadb0f@dread11.news.tele.dk...
 [8<8<8<]
 > Det var MO's formulering " rydder op når der er mangel på plads." der 
 > mindede mig om en garbage collector.
 Sådan opfattede jeg det også   
-- 
 Venlig hilsen
 Mogens Hansen 
            
              |   |   
            
        
 
    
 
					
					 
			 | 
			
				
        
			 |