Pagina 2 di 2 primaprima 1 2
Visualizzazione dei risultati da 11 a 16 su 16
  1. #11
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    1,469
    Originariamente inviato da simo_85

    In ogni caso, fail..
    "fail" in che senso?

    In C, semplicemente, non esiste il passaggio per riferimento, che è specifico del C++.

    Questo è un fatto.

    La seconda porzione di codice (coi puntatori) è il modo "C" del passaggio per riferimento.

    E' solo "zucchero sintattico" introdotto da C++, in analogia ai parametri VAR del pascal.

    Il C# ha introdotto il "ref" (o out), ma è sempre la stessa zuppa

  2. #12
    Originariamente inviato da MItaly
    In un caso usi i reference, nell'altro i puntatori. Il codice eseguibile generato probabilmente sarà identico, dato che i reference risultano essere dei puntatori nascosti.

    Sono esattamente la stessa cosa. Compilando con VS 10 senza ottimizzazioni sia la chiamata:

    codice:
    012E2F7C  lea         eax,[b]  
    012E2F7F  push        eax  
    012E2F80  lea         ecx,[a]  
    012E2F83  push        ecx  
    012E2F84  call        ref (12E11DBh)  
    012E2F89  add         esp,8
    sia la funzione di swap stessa (qua si vede la versione per riferimento senza prologo):

    codice:
        28: 	int t = a;
    012E34CE  mov         eax,dword ptr [a]  
    012E34D1  mov         ecx,dword ptr [eax]  
    012E34D3  mov         dword ptr [t],ecx  
        29: 	a = b;
    012E34D6  mov         eax,dword ptr [a]  
    012E34D9  mov         ecx,dword ptr [b]  
    012E34DC  mov         edx,dword ptr [ecx]  
    012E34DE  mov         dword ptr [eax],edx  
        30: 	b = t;
    012E34E0  mov         eax,dword ptr [b]  
    012E34E3  mov         ecx,dword ptr [t]  
    012E34E6  mov         dword ptr [eax],ecx
    consistono esattamente nelle stesse istruzioni.

    Suppongo che su linux, oltre a rimanere sempre praticamente uguali, sia persino più chiaro il codice, ma per il momento ho Windows sottomano
    Fracty - The Fractal Generator



    If you cannot choose a concise name that expresses what the method does, it is possible that your method is attempting to perform too many diverse tasks.

  3. #13
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Originariamente inviato da GliderKite
    Sono esattamente la stessa cosa.
    A livello assembly si (a parte ovvie differenze legate all'architettura).
    Ma a livello di linguaggio, la versione con i puntatori accetta questa chiamata:
    codice:
    scambia(0,0);
    la versione reference da un errore di compilazione.

  4. #14
    Originariamente inviato da shodan
    A livello assembly si (a parte ovvie differenze legate all'architettura).
    Ma a livello di linguaggio, la versione con i puntatori accetta questa chiamata:
    codice:
    scambia(0,0);
    la versione reference da un errore di compilazione.
    Si certo, pensavo fosse sottointeso
    Fracty - The Fractal Generator



    If you cannot choose a concise name that expresses what the method does, it is possible that your method is attempting to perform too many diverse tasks.

  5. #15
    Comunque, la regola generale in C++ è "usa i reference quando puoi, i puntatori quando devi".
    Alcuni tuttavia preferiscono usare i puntatori quando si vuole dare un segnale visivo "forte" che l'oggetto passato ad una funzione verrà modificato.
    Amaro C++, il gusto pieno dell'undefined behavior.

  6. #16
    I riferimenti possono essere visti semplicemente come una scorciatoia sintattica verso i puntatori, con il vantaggio che il compilatore verifica (quando puo') che siano indirizzi validi oppure no. Essenzialmente sono stati introdotti per "chiudere" certi aspetti semantici introdotti dal C++: costruttore di copia ecc..

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.