Tipi

di il
7 risposte

Tipi

Buonasera, una domanda forse un po' strana, ma non ho trovato niente a riguardo in diversi libri di C e C++. Dove vengono memorizzate le informazioni sul tipo di un oggetto o di una variabile, nell'area dati (o nello stack, se la variabile è automatica) oppure nelle istruzioni nell'area codice? La parte di operazione dell'istruzione in codice macchina di caricamento (la LOAD in Assembler), tanto per fare un esempio, è diversa se c'è da caricare un int o un float, oppure il codice dell'operazione è la stessa e il fatto che sia un intero (o un reale) è memorizzato nella variabile?

Grazie

7 Risposte

  • Re: Tipi

    No, nessuna differenza, sono tutte sequenze di byte assolutamente identiche tra loro (non c'è differenza alcuna). Sono utilizzate diversamente dal codice.
  • Re: Tipi

    oregon ha scritto:


    No, nessuna differenza, sono tutte sequenze di byte assolutamente identiche tra loro (non c'è differenza alcuna). Sono utilizzate diversamente dal codice.
    Forse è il vino che ho bevuto a cena, ma non ho capito. Fra cosa non c'è differenza?
  • Re: Tipi

    Le informazioni sono memorizzate in sequenza nei byte di memoria, senza alcuna differenza se questo è un intero o un double. Ovvero non c'è alcuna differenza in quel senso e non c'è alcuna informazione memorizzata circa il tipo del dato..
  • Re: Tipi

    oregon ha scritto:


    Le informazioni sono memorizzate in sequenza nei byte di memoria, senza alcuna differenza se questo è un intero o un double. Ovvero non c'è alcuna differenza in quel senso e non c'è alcuna informazione memorizzata circa il tipo del dato..
    Ah ok, quindi sono le istruzioni macchina che sono diverse. Per esempio, la ADD che somma un int è diversa dalla ADD che somma un float. Ho capito bene?
  • Re: Tipi

    Nì ... in genere sono usate le istruzioni apposite matematiche (del coprocessore per intenderci).

    Le righe che seguono
    
    unsigned char dat[] = {0xd8, 0x0f, 0x49, 0x40};
    
    printf("%d\n", *((int *)dat));
    printf("%f\n", *((float *)dat));
    
    sono un esempio di come gli stessi 4 byte sono interpretabili come intero o come float.
  • Re: Tipi

    Si puo' essere un po' piu' precisi:

    La gestione dei tipi primitivi (interi, double, char, vettoridi tipi primitivi) e' totalmente a carico del compilatore: cioe' e' il compilatore che tiene traccia del tipo dell'oggetto e corrispondentemente che tipo di istruzione assembler usare (8/16/32/84 bit).

    A carico del compilatore e' anche tutta la gestione delle strutture dati (struct/class/union) che non coinvolgono la keyword virtual.

    Invece, la gestione dei metodi virtuali, dell'overloading e dell'ereditarieta (semplice e multipla) e' gestita parte dal compilatore e parte da strutture dati di servizio allocate nella sezione degli oggetti globali.

    Queste strutture dati vengono utilizzate dagli operatoridynamic_cast,typeid e typeof, durante la conversione di un puntatore di una classe base in uno di una classe derivata, oppure la conversione di una classe derivata in una classe base quando la classe risulta avere ereditarieta' multipla (deriva da due o piu' classi, direttamente o indirettamente).

    Al momento, in C++ manca un supporto completo alla reflection, sullo stile di Java e C#.
    Queste informazioni, in realta', esistono, perche' vengono utilizzate dal debugger, ma non sono disponibili ufficialmente.
  • Re: Tipi

    migliorabile ha scritto:


    Si puo' essere un po' piu' precisi:

    La gestione dei tipi primitivi (interi, double, char, vettoridi tipi primitivi) e' totalmente a carico del compilatore: cioe' e' il compilatore che tiene traccia del tipo dell'oggetto e corrispondentemente che tipo di istruzione assembler usare (8/16/32/84 bit).

    A carico del compilatore e' anche tutta la gestione delle strutture dati (struct/class/union) che non coinvolgono la keyword virtual.

    Invece, la gestione dei metodi virtuali, dell'overloading e dell'ereditarieta (semplice e multipla) e' gestita parte dal compilatore e parte da strutture dati di servizio allocate nella sezione degli oggetti globali.

    Queste strutture dati vengono utilizzate dagli operatoridynamic_cast,typeid e typeof, durante la conversione di un puntatore di una classe base in uno di una classe derivata, oppure la conversione di una classe derivata in una classe base quando la classe risulta avere ereditarieta' multipla (deriva da due o piu' classi, direttamente o indirettamente).

    Al momento, in C++ manca un supporto completo alla reflection, sullo stile di Java e C#.
    Queste informazioni, in realta', esistono, perche' vengono utilizzate dal debugger, ma non sono disponibili ufficialmente.
    Grazie, spiegazione chiara.
Devi accedere o registrarti per scrivere nel forum
7 risposte