Visualizzazione dei risultati da 1 a 9 su 9
  1. #1

    [C++]-Reference e Puntatori

    Salve a tutti!
    Vorrei alcune delucidazioni su quanto segue:quando in C++ si utilizza una variabile di tipo reference(ad esempio un reference ad intero come int &x), tale variabile reference occupa memoria oppure no? Perchè, se la consideriamo semplicemente come un alias di una variabile alla quale si riferisce, il reference è semplicemente un altro nome per chiamare questa variabile. Ad esempio: dichiaro int y e poi int &x=y. Quindi, non occuperebbe memoria.

    Invece, se considerassimo un puntatore ad intero la situazione sarebbe diversa. Ad esempio: int y e int *x=&y. Qui, la variabile x occuperebbe memoria e conterrebbe l'indirizzo della variabile x.

    Quindi, nel caso di una variabile reference non avrei occupazione di memoria( se non per la variabile int y dell'esempio). Mentre, nel caso di una variabile puntatore avrei l'occupazione di memoria di int y e l'occupazione di int *x.

    E' corretto quanto ho detto? Grazie.

  2. #2
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    I reference sono dei puntatori mascherati, quindi occupano memoria come tutte le altre variabili.
    A differenza dei puntatori, però, i reference devono sempre riferirsi a qualcosa di valido, ossia non possono essere NULL o nullptr.
    E Ii motivo della loro introduzione è dovuto alla ridefinizione degli operatori ( +, -, / etc...) che sarebbe stata arzigogolata fatta con i puntatori.
    Per cui, no: non è corretto quello che hai scritto.
    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.

  3. #3
    Il discorso è un po' più sottile... il fatto che i reference siano puntatori mascherati non è strettamente richiesto, e, dato che lo standard non consente né di prendere l'indirizzo di un reference né si chiederne le dimensioni, i compilatori sono particolarmente facilitati a farli sparire appena riescono. Per dire, qualunque compilatore farà sparire immediatamente un reference locale del tipo:
    codice:
    int una_variabile_con_nome_lunghissimo = 2;
    
    void test() {
        int &t = una_variabile_con_nome_lunghissimo;
        t = 2;
        ...
        std::cin>>t;
        ...
        std::cout<<t;
        ...
        t=5;
    }
    (anche se probabilmente farebbe la stessa cosa con un puntatore, a patto di non prenderne l'indirizzo)
    Amaro C++, il gusto pieno dell'undefined behavior.

  4. #4
    Grazie ad entrambi per le risposte!

    Quote Originariamente inviata da shodan Visualizza il messaggio
    I reference sono dei puntatori mascherati, quindi occupano memoria come tutte le altre variabili.
    A differenza dei puntatori, però, i reference devono sempre riferirsi a qualcosa di valido, ossia non possono essere NULL o nullptr.
    E Ii motivo della loro introduzione è dovuto alla ridefinizione degli operatori ( +, -, / etc...) che sarebbe stata arzigogolata fatta con i puntatori.
    Per cui, no: non è corretto quello che hai scritto.
    Quindi, una variabile reference occupa lo stesso spazio in memoria di un puntatore? E, come un puntatore, contiene(in memoria) l'indirizzo della variabile a cui si sta "riferendo"?

  5. #5
    Comunque, ho fatto questa domanda perchè in rete ho trovato questo:

    http://forum.html.it/forum/showthrea...irizzo+memoria

    Nel penultimo messaggio della prima pagina, un utente dice che i reference non hanno un indirizzo di memoria. Mentre, i puntatori hanno un loro indirizzo.

    Inoltre, ho trovato questo:

    http://www.bo.infn.it/~arcelli/Lezio...LezioneIII.pdf

    A pagina 12, si dice che i reference non allocano nuova memoria.
    Perchè è scritto questo?

  6. #6
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Quindi, una variabile reference occupa lo stesso spazio in memoria di un puntatore? E, come un puntatore, contiene(in memoria) l'indirizzo della variabile a cui si sta "riferendo"?
    No. La variabile reference occupa lo stesso spazio in memoria della variabile referenziata perché "è la variabile referenziata sotto falso nome. Il fatto che io li definisca puntatori mascherati è dovuto al fatto che i reference si comportano( ai fini pratici ) come dei puntatori (con qualche scomodità in meno).
    Però se scrivi :
    codice:
    int p= 10;
    int* q;
    q = &p
    q avra un proprio spazio all'interno dello stack e questo spazio esiste a prescindere da quello che gli verrà messo dentro. Ossia l'indirizzo di q non è l'indirizzo di p.
    Quando scrivi:
    codice:
    int p = 10;
    int& q = p;
    q e p condividono lo stesso spazio all'interno dello stack. Ossia l'indirizzo di q è lo stesso di p.
    Un pò come in una discussione parlare con una persona chiamandola un volta per nome e una per cognome.
    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
    Quote Originariamente inviata da shodan Visualizza il messaggio
    No. La variabile reference occupa lo stesso spazio in memoria della variabile referenziata perché "è la variabile referenziata sotto falso nome. Il fatto che io li definisca puntatori mascherati è dovuto al fatto che i reference si comportano( ai fini pratici ) come dei puntatori (con qualche scomodità in meno).
    Però se scrivi :
    codice:
    int p= 10;
    int* q;
    q = &p
    q avra un proprio spazio all'interno dello stack e questo spazio esiste a prescindere da quello che gli verrà messo dentro. Ossia l'indirizzo di q non è l'indirizzo di p.
    Quando scrivi:
    codice:
    int p = 10;
    int& q = p;
    q e p condividono lo stesso spazio all'interno dello stack. Ossia l'indirizzo di q è lo stesso di p.
    Un pò come in una discussione parlare con una persona chiamandola un volta per nome e una per cognome.
    Ma quello che hai appena scritto, in particolar modo che "p e q condividono lo stesso spazio all'interno dello stack", non è la stessa cosa che ho scritto io nel primo post?

    Ovvero: "Quindi, nel caso di una variabile reference non avrei occupazione di memoria( se non per la variabile int y dell'esempio). Mentre, nel caso di una variabile puntatore avrei l'occupazione di memoria di int y e l'occupazione di int *x."

    Quindi, oltre all'occupazione di memoria della variabile a cui il reference si riferisce(nel tuo esempio il reference q "fa riferimento" alla variabile p), non si ha ulteriore occupazione di spazio.
    Ultima modifica di Stefano.; 05-02-2016 a 01:17

  8. #8
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    In senso stretto, no: è impossibile che qualcosa non occupi memoria. Per cui dire: "Quindi, nel caso di una variabile reference non avrei occupazione di memoria" non mi sembra proprio corretto.

    Sarebbe meglio dire: "Quindi, nel caso di una variabile reference non avrei ulteriore occupazione di memoria perché quella memoria esiste già ed è la stessa della variabile referenziata."

    Spero di essermi chiarito.

    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.

  9. #9
    Ok. Ti ringrazio.

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.