2012-06-11 21 views
7

Me pregunto por qué en el siguiente programa sizeof(int) devuelve un valor diferente de sizeof(int*).¿Por qué sizeof (int) es diferente de sizeof (int *)?

Aquí está el pequeño programa:

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

Y aquí está la salida:

4 
8 

Hasta ahora recuerdo el tamaño de un puntero entero es 4byte (compilador gcc). ¿Cómo puedo verificar el tamaño correcto de un puntero? ¿Es dependiente de la computadora?

Estoy corriendo Ubuntu 12,04

# lsb_release -a 

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

es el tamaño del puntero no es constante (tamaño estándar) de 8 bytes.

+7

64 bit Sistema operativo? – gliderkite

+1

@ ahenderson- ¿Estás seguro de que todos los punteros tienen la garantía de ser del mismo tamaño? – templatetypedef

+0

También agregue la salida de 'uname -a' o' archivo ' – 0xC0000022L

Respuesta

15

El tamaño de int y int* es completamente compilador y depende del hardware. Si está viendo ocho bytes utilizados en un int*, es probable que tenga hardware de 64 bits, lo que se traduce en ocho bytes por puntero.

Espero que esto ayude!

+5

"Es probable que tenga un sistema operativo de 64 bits". De hecho, pero lo más importante es que su proceso probablemente sea un proceso de 64 bits. :-) –

+3

Me gustaría agregar, que el único tipo cuyo tamaño está definido por estándar es 'char'. 'sizeof (char)' siempre es '1' – LihO

+1

@LihO: el tamaño de un' char' no está realmente definido por el estándar, pero 'sizeof' express es el resultado en _número de chars_. –

4

El tamaño de un puntero es sistema, compilador y depende de la arquitectura. En los sistemas de 32 bits, normalmente será de 32 bits, mientras que en los sistemas de 64 bits normalmente serán de 64 bits.

Si intenta almacenar un puntero en un entero para su posterior restauración en el puntero, puede usar el tipo intptr_t que es un tipo integral lo suficientemente grande como para contener (creo) los tipos de puntero normales (sin función) .

7

sizeof(char) == 1

No hay otras garantías (*).

En la práctica, los punteros serán del tamaño 2 en un sistema de 16 bits, 4 en un sistema de 32 bits y 8 en un sistema de 64 bits.


(*) Ver el comentario de James Kanze.

+1

gracias a todos :) mi duda es clara – yogi

+2

'sizeof (char) <= sizeof (short) <= sizeof (int) <= sizeof (long) <= sizeof (long long)' también se garantiza. Como es 'sizeof (float) <= sizeof (double) <= sizeof (long double)'. (También hay una garantía de que todos los tamaños son integrales, pero eso se comprende más o menos). –

+0

@JamesKanze Querer ser pedante, sí, buen comentario. Traté de escribir la respuesta lo más clara posible según el tipo de pregunta y pregunta. – gliderkite

2

Para sistemas de 32 bits, el estándar de facto es ILP32 - es decir, int, largo y puntero son todas las cantidades de 32 bits.

Para sistemas de 64 bits, el estándar primario de facto de Unix es LP64 - de largo y el puntero son de 64 bits (pero int es de 32 bits). El estándar de Windows 64-bit es LLP64 - long long y puntero son 64 bits (pero long e int son ambos de 32 bits).

En un momento, algunos sistemas Unix usaban una organización ILP64.

Ninguna de estas normas de facto está legislada por la norma C (ISO/IEC 9899: 1999), pero todas están permitidas por ella.

y

Si usted se refiere a la portabilidad, o desea que el nombre del tipo de refleja el tamaño, se puede ver en la cabecera, donde las siguientes macros están disponibles:

int8_t int16_t int32_t int64_t

int8_t se garantiza que sea de 8 bits, y int16_t se garantiza que sea 16 bits, etc.

Ver esto question.

+0

No hay garantía de que exista 'int8_t' etc. Para una máxima portabilidad, simplemente use 'int', a menos que sepa que necesita algo más grande y valide su entrada. –

+0

@JamesKanze: ??? es bastante estándar. http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/inttypes.h.html –

+0

@OAOD '' es el encabezado estándar de C y C++ en el que se definen estos tipos, y en '', 'int8_t' et Alabama. están marcados como opcionales En el estándar C, creo que son "necesarios" si el hardware los admite; ese es en cualquier caso el intento.Pero deben ser tipos de tamaño exactos, y los tipos firmados deben ser complemento de 2. En máquinas que no tienen bytes de 8 bits, o que no son complemento de 2, no se definirán. (Posix los requiere, lo que limita el hardware en el que se puede implementar). –