2012-06-11 16 views
7

Mi chiedo il motivo per cui nel seguente programma sizeof(int) restituisce un valore diverso da sizeof(int*).Perché sizeof (int) è diverso da sizeof (int *)?

Ecco il piccolo programma:

int main(){ 
    std::cout<<sizeof(int)<<endl; 
    std::cout<<sizeof(int*)<<endl; 
    return 0; 
} 

Ed ecco l'output:

4 
8 

Fino ad ora mi ricordo la dimensione di un puntatore intero è 4byte (compilatore gcc). Come posso verificare la dimensione corretta di un puntatore? È dipendente dal computer?

Sono in esecuzione Ubuntu 12,04

# lsb_release -a 

Distributor ID: Ubuntu 
Description: Ubuntu 12.04 LTS 
Release: 12.04 
Codename: precise 

è la dimensione del puntatore non è costante (dimensioni standard) 8 byte.

+7

Sistema operativo a 64 bit? – gliderkite

+1

@ ahenderson- Sei sicuro che tutti i puntatori abbiano le stesse dimensioni? – templatetypedef

+0

Aggiungete anche l'output di 'uname -a' o' file ' – 0xC0000022L

risposta

15

Le dimensioni di un int e un int* dipendono completamente dal compilatore e dall'hardware. Se visualizzi otto byte utilizzati in un int*, probabilmente hai un hardware a 64 bit, che si traduce in otto byte per puntatore.

Spero che questo aiuti!

+5

"Probabilmente hai un sistema operativo a 64 bit." In effetti, ma ancora più importante, il tuo processo è probabilmente un processo a 64 bit. :-) –

+3

Vorrei aggiungere che l'unico tipo la cui dimensione è definita dallo standard è 'char'. 'sizeof (char)' è sempre '1' – LihO

+1

@LihO: la dimensione di un' char' non è effettivamente definita dallo standard, ma 'sizeof' express è il risultato di _numero di caratteri_. –

4

Le dimensioni di un puntatore dipendono dal sistema, dal compilatore e dall'architettura. Sui sistemi a 32 bit sarà tipicamente 32 bit mentre sui sistemi a 64 bit saranno tipicamente 64 bit.

Se si sta tentando di memorizzare un puntatore in un numero intero per il successivo ripristino nel puntatore, è possibile utilizzare il tipo intptr_t che è un tipo integrale abbastanza grande da contenere (credo) tipi di puntatori normali (non funzione) .

7

sizeof(char) == 1

Non ci sono altre garanzie (*).

In pratica, i puntatori saranno di dimensione 2 su un sistema a 16 bit, 4 su un sistema a 32 bit e 8 su un sistema a 64 bit.


(*) Vedere il commento di James Kanze.

+1

grazie a tutti :) il mio dubbio è chiaro – yogi

+2

'sizeof (char) <= sizeof (breve) <= sizeof (int) <= sizeof (long) <= sizeof (long long)' è anche garantito. Così come 'sizeof (float) <= sizeof (double) <= sizeof (long double)'. (C'è anche la garanzia che tutte le taglie siano integre, ma questo è più o meno compreso.) –

+0

@JamesKanze Volendo essere pedante sì, buon commento. Ho cercato di scrivere la risposta il più chiara possibile in base al tipo di domanda e questionario. – gliderkite

2

Per i sistemi a 32 bit, lo standard 'de facto' è ILP32 - cioè, int, lungo e puntatore sono tutte le quantità a 32 bit.

Per i sistemi a 64 bit, lo standard Unix "de facto" primario è LP64 - lungo e il puntatore a 64 bit (ma int è a 32 bit). Lo standard Windows 64-bit è LLP64 - long long e il puntatore è 64-bit (ma long e int sono entrambi a 32-bit).

Una volta, alcuni sistemi Unix utilizzavano un'organizzazione ILP64.

Nessuno di questi standard de facto è legiferato dallo standard C (ISO/IEC 9899: 1999), ma tutti sono autorizzati da questo.

e

Se siete interessati con la portabilità, o se si vuole il nome del tipo riflette le dimensioni, si può guardare l'intestazione, in cui sono disponibili le seguenti macro:

int8_t int16_t int32_t int64_t

int8_t è garantito per essere di 8 bit, e int16_t è garantito per essere 16 bit, ecc.

Vedere questo question.

+0

Non è garantito che 'int8_t' ecc. Esista. Per la massima portabilità, usa 'int', a meno che tu non sappia che hai bisogno di qualcosa di più grande, e convalida il tuo input. –

+0

@JamesKanze: ??? è abbastanza standard. http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/inttypes.h.html –

+0

@OAOD '' è l'intestazione standard C e C++ in cui questi tipi sono definiti e in '', 'int8_t' et al. sono contrassegnati come facoltativi. Nello standard C, penso che siano "obbligatori" se l'hardware li supporta; questo è in ogni caso l'intento.Ma devono essere dei tipi esatti di dimensioni e i tipi firmati devono essere il complemento a 2. Sulle macchine che non hanno byte da 8 bit o che non sono il complemento a 2, non saranno definite. (Posix li richiede, il che limita l'hardware su cui può essere implementato.) –