Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Realokacija memorije C/C++ Realloc i New

[es] :: C/C++ programiranje :: Realokacija memorije C/C++ Realloc i New

[ Pregleda: 3734 | Odgovora: 6 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

boris Dj.bl
Dipl.ing.
Banjaluka

Član broj: 167469
Poruke: 77
79.143.164.*



Profil

icon Realokacija memorije C/C++ Realloc i New02.07.2008. u 15:42 - pre 192 meseci
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");
}       
 
Odgovor na temu

karas

Član broj: 5574
Poruke: 482
*.dynamic.sbb.rs.



+1 Profil

icon Re: Realokacija memorije C/C++ Realloc i New02.07.2008. u 18:46 - pre 192 meseci
http://www.research.att.com/~bs/bs_faq2.html#renew
http://www.research.att.com/~bs/bs_faq2.html#realloc
Sveti Avgustin: "Dobar hrišćanin treba da se kloni matematičara i svih onih koji daju lažna proročanstva. Postoji opasnost da su matematičari već sklopili pakt sa Đavolom, da pomrače čovekov um i da ga okuju okovima pakla."
 
Odgovor na temu

Goran Arandjelovic
Beograd

Član broj: 29116
Poruke: 387
*.dynamic.sbb.rs.



+9 Profil

icon Re: Realokacija memorije C/C++ Realloc i New02.07.2008. u 23:54 - pre 192 meseci
U principu, karas ti je odgovorio.

E sad, ako baš želiš, uvek možeš za neki svoj tip da overloaduješ operator new i delete (i da njih interno implementiraš koristeći malloc/free...). Onda bi mogao i da koristiš realloc ako želiš... Takođe, pogledaj nešto o placement new operatoru. Moglo bi da ti koristi...
 
Odgovor na temu

Dragi Tata
Malo ispod Kanade

Član broj: 1958
Poruke: 3906
*.hsd1.ma.comcast.net.



+6 Profil

icon Re: Realokacija memorije C/C++ Realloc i New03.07.2008. u 00:06 - pre 192 meseci
+1 za karaseve linkove, i da dodam još jedan: http://www.novetehnologije.com...-korak-sa-STL-bibliotekom.aspx
 
Odgovor na temu

boris Dj.bl
Dipl.ing.
Banjaluka

Član broj: 167469
Poruke: 77
79.143.164.*



Profil

icon Re: Realokacija memorije C/C++ Realloc i New03.07.2008. u 11:34 - pre 192 meseci
Prvo da se zahvalim za sve linkove.
A sad bi ja sam dao odgovor koliko sam shvatio iz ovih linkova.
Iz prostog razloga sto ce mozda jos neko imati slicno pitanje pa da ne mora pretrazivati po drugim linkovima vec da sve bude na jednom mjestu.

Prva stvar je da se u C++ ne praktikuje koriscenje realloc, iako nije zabranjeno, jer to radi samo za nizove alocirane sa malloc, ne i za one sa new, a takodje ne radi ako imamo niz korisnickih objekata.
Posto je C++ objektno orjentisani program uglavnom se i koriste objekti pa tad se ne moze koristiti malloc.
Tako da niz alociran sa malloc mora se brisati sa free a niz alociran sa new mora se brisati sa delete. Ne smije se mijesati.

Pitanje je sta onda ako nam bas treba realokacija.
Jedan odgovor je moj zadatak(drugi i treci).
Treci je zapravo bolji jer je da kazemo efikasniji a jeste ispravan.

Takodje mozemo napraviti funkciju koja ce raditi realokaciju pomocu new i delete.
To je zapravo ovo sto sam ja uradio u trecem samo da se nalazi u funkciji pa ne moramo svaki put pisati vec samo pozovemo funkciju.
Cetrvti zadatak je ovako uradjen.
I tu se niz ne povecava za jedno mjesto vec se uduplava pri alokaciji pa se ne zove svaki put ta fukcija vec samo kad se napuni niz sto je efikasnije.

I na kraju postoji jos jedan prilicno dobar nacin.
Da koristimo template klasu Vector.
Ovdje je realokacija vec realizovana kad je potrebno a mi samo pozivamo odgovarajuce funkcije.
Peti zadatak je uradjen na ovaj nacin i vjerujem da je sve jasno.
Ipak evo i direktan link ka dokumentaciji za Vector a uvijek se mogu ovdje postavljati dodatna pitanja.

[url]http://www.cplusplus.com/reference/stl/vector/[/url]
Google: "http://www.cplusplus.com/reference/stl/vector/"

[url]http://www.fredosaurus.com/notes-cpp/stl-containers/vector/header-vector.html[/url] Google: "http://www.fredosaurus.com/notes-cpp/stl-containers/vector/header-vector.html"

I jos samo da doda, cisto informativno za one koje zanima, vecktor je dobar za dinamicku alokaciju ako se elementi dodaju ili skidaju sa kraju.
S druge strane ako trebamo ubacivati i izbacivati elemente iz sredine onda nije najefikasniji jer se svki put elementi moraju pomjerati.
Tad je bolje koristiti listu, jedino sto je tad sporiji pristup samim elementima jer nije direktan pa mi uvijek trebamo odmjeriti sta nam je bitnije.


Code:

//Cetvrti program C++
#include <iostream>
using namespace std;

void reallocate(int* &p, int& duz) {
    int n=duz;
    duz*=2; // uduplava velicinu niza
    int * temp = new int[duz];
    for(int i=0;i<n;i++) temp[i]=p[i]; //kopira originalni niz u uduplani
    delete [] p; // brise originalni
    p=temp; // dodjeljuje p uvecanom nizu
}

main(){
    int b,i=0,n,duz=1;
    int *p = new int[duz];
    cout<<"Unesi brojeve:"<<endl;
    do {
        cout<<i+1<<". broj:"; 
        cin>>b;
        if(b==0) break;
        
        if(i==duz)
            reallocate(p,duz);
        
        *(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");
}       


Code:

//Peti program C++
#include <iostream>
#include <vector>
using namespace std;

main(){
    int b,i=0,n,duz=1;
    vector<int> p;
    // vector<int> p(100); moze i ovako kad se odmah oslobadja 100 mjesta pa se realokacija vrsi tek sa 101 elementom
    // v.resize(20); postavlja velinu vektora na 20
    cout<<"Unesi brojeve:"<<endl;
    do {
        cout<<i+1<<". broj:"; 
        cin>>b;
        if(b==0) break;
        
        p.push_back(b);
        
        i++;
    }while(1);
    
    n=i; 
    cout<<endl; 
    
    for(i=0;i<n;i++) {
        cout<<i+1<<". broj:"; 
        cout<<p[i]<<endl; 
    }

    system("pause");
}       


[Ovu poruku je menjao boris Dj.bl dana 03.07.2008. u 12:45 GMT+1]

[Ovu poruku je menjao boris Dj.bl dana 03.07.2008. u 12:50 GMT+1]
 
Odgovor na temu

karas

Član broj: 5574
Poruke: 482
217.26.78.*



+1 Profil

icon Re: Realokacija memorije C/C++ Realloc i New03.07.2008. u 14:40 - pre 192 meseci
Tu je jos i deque (http://www.cplusplus.com/reference/stl/deque/) koji brzo ubacuje elemente na pocetak i na kraj niza.
Sveti Avgustin: "Dobar hrišćanin treba da se kloni matematičara i svih onih koji daju lažna proročanstva. Postoji opasnost da su matematičari već sklopili pakt sa Đavolom, da pomrače čovekov um i da ga okuju okovima pakla."
 
Odgovor na temu

Eurora3D Team
Nebojsa - Programer & Vodja tima
Beograd

Član broj: 120376
Poruke: 900
91.148.114.*



+7 Profil

icon Re: Realokacija memorije C/C++ Realloc i New03.07.2008. u 22:15 - pre 192 meseci
Citat:
Dragi Tata: +1 za karaseve linkove, i da dodam još jedan: http://www.novetehnologije.com...-korak-sa-STL-bibliotekom.aspx

Da dodam i ja ++
Svaka cast , a svaka cast i autoru tekstova
A ovaj kod mozes da svedes i na ovo
Code:

#include <iostream>
#include <vector>
using namespace std;

int main()
{
    int n =0; vector<int> niz;
    cout <<"Unesi brojeve: \n";
    while (cout << "broj : " && cin >> n && n!=0)
        niz.push_back(n);
    n = -1;
    while ( ++n < niz.size())
        cout << "Broj na poziciji " << n << " je " << niz[n] << endl;
    return 0;
}


[Ovu poruku je menjao Eurora3D Team dana 03.07.2008. u 23:46 GMT+1]
 
Odgovor na temu

[es] :: C/C++ programiranje :: Realokacija memorije C/C++ Realloc i New

[ Pregleda: 3734 | Odgovora: 6 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.