PDA

Visualizza la versione completa : [c++] istanziare una classe.. puntatore o 'statico' ?


xnavigator
30-12-2009, 02:53
ragazzi per istanziare un oggetto nel main conviene fare:

myClass c;

oppure

myClass *c;
c= new myClass;

?

mi dite che differenza c'è tra i 2 e perchè dovrei preferire il metodo con la new?

grazie

lelmarir
30-12-2009, 04:32
Come da tuo titolo: il primo metodo e' statico, il secondo dinamico

Statico: myClass c;

tutte le risorse necessarie vengono allocate ancor prima che parta l'esecuzione del programma perché lo spazio occupato dalla classe e' definito in fase di compilazione.
Questo significa che sia che tu utilizzi veramente l'istanza oppure la dichiari solo (salvo ottimizzazioni del compilatore) lo spazio in memoria viene ugualmente riservato (e quindi sprecato in caso di inutilizzo)

Questo puo sembrare irrilevante per una piccola classe di esempio, ma quando queste iniziano a diventare strutture complesse contenenti array di grosse dimensioni lo spazio sprecato e' considerevole.
D'altra parte, in questo modo se la variabile viene sovrascritta spesso in questo modo si evita di ripetere continuamente la procedura di allocazioen in memoria.
L'occupazione di memoria perdura fino alla terminazione del programma. Questo metodo e' corretto se la variabile viene utilizzata durante gran parte del ciclo di vita del programma.

Dinamico : myClass *c= new myClass;
Sintassi propria di linguaggi ad "alto livello", in memoria viene riservato un puntatore (dimensioni trascurabili e indipendenti dalla classe) e l'istanza viene generata dinamicamente durante l'esecuzione e solo quando viene richiamata l'istruzione "new myClass;".
Un istanza generata con new puo quindi essere creata nel momento in cui serve e distrutta nell'istante stesso in cui non e' piu necessaria. (in modo da liberare risorse che potrebbero servire ad altri)

Tutto questo sembra insignificante per la maggior parte delle applicazioni che si scrivono, ma se pensi a un algoritmo di compressione/decompressione file che usa grandi quantitativi di memoria : non sarebbe carino che iniziasse a occupare il massimo della memoria potenzialmente necessaria ancor prima di dirgli su quali file dovrà lavorare.

gianvituzzi
30-12-2009, 04:47
molto interessante la tua spiegazione, sopratutto quando dici:



tutte le risorse necessarie vengono allocate ancor prima che parta l'esecuzione del programma perché lo spazio occupato dalla classe e' definito in fase di compilazione
...
D'altra parte, in questo modo se la variabile viene sovrascritta spesso in questo modo si evita di ripetere continuamente la procedura di allocazioen in memoria.
L'occupazione di memoria perdura fino alla terminazione del programma. Questo metodo e' corretto se la variabile viene utilizzata durante gran parte del ciclo di vita del programma
...


mi trovo adesso a scrivere un programma che deve instanziare un'array di una struttura di dati:



// Define WAVEHDR Structure (WaveForm API)
int num_buffers = 3;
WAVEHDR *buff = new WAVEHDR[num_buffers];
for (int i = 0; i<num_buffers; i++)
{
ZeroMemory(&buff[i], sizeof(buff));
buff[i].lpData = (LPSTR) malloc(32768);
buff[i].dwBufferLength = 32768;
buff[i].dwBytesRecorded = 0;
buff[i].dwFlags = 0;

waveInPrepareHeader(hwi, &buff[i], sizeof(WAVEHDR));
waveInAddBuffer(hwi, &buff[i], sizeof(WAVEHDR));
}


essendo la WAVEHDR la struttura principale del mio programma (la uso come buffer) mi conviene secondo te quindi molto di più inizializzarla in modo "statico" o "dinamico" ??

grazie

shodan
30-12-2009, 12:46
Originariamente inviato da xnavigator
mi dite che differenza c'è tra i 2

Il lifetime del primo è gestito dal compilatore, il secondo lo devi gestire tu.


e perchè dovrei preferire il metodo con la new?

Perchè dovresti preferirlo? Sono cose diverse con scopi diversi.

xnavigator
30-12-2009, 12:46
Originariamente inviato da lelmarir
Come da tuo titolo: il primo metodo e' statico, il secondo dinamico

Statico: myClass c;

[...]
potenzialmente necessaria ancor prima di dirgli su quali file dovrà lavorare.

bhè mi sembra un'ottima spiegazione..
nel mio caso:

a. la mia classe è abbastanza piccola
b. la dovrei utilizzare per tutta la vita del mio programma

quindi credo di utilizzare la dichiarazione "statica"...

aspetto anche altri pareri comunque, anche perchè il mio prof se ricordo bene vuole che ogni variabile sia inizializzata con la new... ( e non riesco a capire il perchè )

shodan
30-12-2009, 12:47
Originariamente inviato da xnavigator
anche perchè il mio prof se ricordo bene vuole che ogni variabile sia inizializzata con la new... ( e non riesco a capire il perchè )
Non è che ha scambiato il C++ con Java?

xnavigator
30-12-2009, 12:51
Originariamente inviato da shodan
Non è che ha scambiato il C++ con Java?


tutto può essere........ :fagiano:

non è che casomai c'è un link ad un sito ufficiale ( del tipo cplusplus.com ) che spiega che si può utilizzare tranquillamente l'allocazione statica? cosi lo riporto per stare tranquillo


inoltre piccola domanda sulla sintassi:
per usare il costruttore con argomenti con il metodo statico come farei?

myClass myIstanza(1.0)?


grazie

YuYevon
30-12-2009, 12:55
Originariamente inviato da xnavigator
anche perchè il mio prof se ricordo bene vuole che ogni variabile sia inizializzata con la new... ( e non riesco a capire il perchè )

"quel" prof non mi pare abbia mai preteso nulla del genere, forse ti confondi col fatto che pretende l'allocazione dinamica con new (e deallocazione con delete) senza ricorrere alle funzioni malloc(), calloc() e free() del C.

Se poi da quest'anno gli è venuta anche questa fissazione, allora fammelo sapere che vado ad agraria finché sono in tempo, anche se con lui ho già concluso da un pezzo.


Originariamente inviato da xnavigator
inoltre piccola domanda sulla sintassi:
per usare il costruttore con argomenti con il metodo statico come farei?

myClass myIstanza(1.0)?


Dipende da come hai definito il costruttore.

EDIT: intendo ovviamente dire che quello sarebbe il modo corretto se la tua classe avesse un costruttore adatto per quel tipo di dichiarazione.

xnavigator
30-12-2009, 13:00
Originariamente inviato da YuYevon


EDIT: intendo ovviamente dire che quello sarebbe il modo corretto se la tua classe avesse un costruttore adatto per quel tipo di dichiarazione.

ok perfetto quindi è giusto fare cosi thx :ciauz:

shodan
30-12-2009, 13:02
E spiegato in tutti i libri nei primi capitoli.
Scrivere:


myClass myIstanza;

non è diverso da scrivere:


int variabile;

L'unica cosa da fare attenzione è lo scope (il lifetime) della variabile, che in C++ può essere ridotto in vari modi. (Ad esempio dichiarando la variabile dentro un if o un for. Usciti da if o for non esiste più, ma vale per tutte le variabili dichiarate sullo stack, nessuna esclusa).
Probabilmente il tuo prof vuol farti usare new ( e relative deleteper fare pratica).



per usare il costruttore con argomenti con il metodo statico come farei?

myClass myIstanza(1.0)

Si.
Notare che funziona anche con le variabili fondamentali.


char c('a');
int k(0);

Loading