[ boris Dj.bl @ 02.07.2008. 15:42 ] @
Znam da se u C-u koristi funkcija realloc za realokaciju memorije ( imamo jos i ostale malloc, callocm, free). E sad u C++ se koristi new i free. Posto, koliko ja znam, realloc prvo proba da oslobodi dodatnu memoriju u nastavku pa ako ne moze nadje novu slobodnu memoriju potrebne velicine gdje prekopira podatke i tad se moze dalje dodavati. Koriscenjem new i free se uvijek mora kopirati cijeli niz (posto o tom govorim u ovom konkretnom slucaju) i moram ja to raditi. Prema tome izvlacim zakljucak da je funkcija iz C-a realloc nekad efikasnija od new iz C++ a i jednostavnija za koriscenje jer sa new i free ja to moram realizovati realokaciju. Prvo me zanima jel to tacno. Druga stvar je kako se ovo konkteno realizuje u C++. Da li kao sto sam ja uradio. Ja sam napisao tri kratka programa koji rade isto na razlicite nacine. Prvi je C-ov a drugi i treci za C++. Program prakticno ucitiva niz brojeva sve dok ne unesemo 0. Taj niz svaki put dinamicki realocira i poveca mu duzinu za 1. Na kraju ispise niz pa ga izbrise. Znam da ovo i nije najefikasnije da se svaki put realocira memorija (bolje bi bilo to raditi u blokovima, recimo osloboditi npr po 10 mjesta kad se ona napune jos 10 itd) al to sad nije poenta nego sam nacin realokacije. U prvom programu sam jednostavno iskoristio realloc. U drugom programu svaki put niz se kopira u pomocni niz, obrisem prvobitni niz pa ga pnovo alociram sa jednim mjestom vise, prekopiram nazad iz pomocnog i upisem novi element pa obrisem pomocni niz. Treci program je slican drugom samo kad napravim pomocnu niz ja njemu dodam novi element, obrisem prvi niz i kazem da pokazivac prvog niza pokazuje na pomocnu. (bice vam jasno iz koda) Ovaj program bi trebao biti efikasniji od drugog Da napomenet da svi programi rade ispravno. Takodje da li je treci program potpuno ispravan u teoriji? I da li postoji neki bolji nacin za realokaciju u C++ od ovih? Code: //Prvi program C #include <stdio.h> #include <stdlib.h> main(){ int b,i=0,n,*p=NULL; printf("Unesi brojeve:\n"); do { printf("%d. broj:",i+1); scanf("%d",&b); if(b==0) break; p= (int*) realloc(p,(i+1)*sizeof(int)); p[i]=b; i++; }while(1); n=i; printf("\n"); for(i=0;i<n;i++) { printf("%d. broj:",i+1); printf("%d\n",p[i]); } free(p); system("pause"); } Code: //Drugi program C++ #include <iostream> using namespace std; main(){ int b,i=0,j,n,*p,*p1; cout<<"Unesi brojeve:"<<endl; do { cout<<i+1<<". broj:"; cin>>b; if(b==0) break; p1= new int[i]; for(j=0;j<i;j++) *(p1+j)=*(p+j); delete [] p; p= new int[i+1]; for(j=0;j<i;j++) *(p+j)=*(p1+j); *(p+i)=b; delete [] p1; i++; }while(1); n=i; cout<<endl; for(i=0;i<n;i++) { cout<<i+1<<". broj:"; cout<<p[i]<<endl; } delete [] p; system("pause"); } Code: //Treci program C++ #include <iostream> using namespace std; main(){ int b,i=0,j,n,*p,*p1; cout<<"Unesi brojeve:"<<endl; do { cout<<i+1<<". broj:"; cin>>b; if(b==0) break; p1= new int[i+1]; for(j=0;j<i;j++) *(p1+j)=*(p+j); delete [] p; p=p1; *(p+i)=b; i++; }while(1); n=i; cout<<endl; for(i=0;i<n;i++) { cout<<i+1<<". broj:"; cout<<p[i]<<endl; } delete [] p; system("pause"); } |