Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 17
  1. #1

    [c++] istanziare una classe.. puntatore o 'statico' ?

    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

  2. #2
    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.

  3. #3
    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:

    codice:
    // 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
    Alla batteria dai retta ballA

  4. #4
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381

    Re: [c++] istanziare una classe.. puntatore o 'statico' ?

    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.
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  5. #5
    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è )

  6. #6
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    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?
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  7. #7
    Originariamente inviato da shodan
    Non è che ha scambiato il C++ con Java?

    tutto può essere........

    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

  8. #8
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    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.
    every day above ground is a good one

  9. #9
    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

  10. #10
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    E spiegato in tutti i libri nei primi capitoli.
    Scrivere:
    codice:
    myClass myIstanza;
    non è diverso da scrivere:
    codice:
    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.
    codice:
    char c('a'); 
    int k(0);
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.