2012-03-10 6 views
7

Me preguntaba por qué se usa este size_t donde puedo usar decir int tipo. Se dice que size_t es un tipo de devolución del operador sizeof. Qué significa eso? como si utilizo sizeof(int) y guardo su devolución a una variable de tipo int, entonces también funciona, no es necesario almacenarlo en una variable de tipo size_t. Yo sólo quiero saber claramente el concepto básico de usar size_t con example.Thanks claramente comprensibles¿alguien puede explicar por qué size_t type se usa con un ejemplo?

+0

Puede utilizar un int para almacenar la devolución de sizeof de la misma manera que a veces puede almacenar 2147483647 en un int. Simplemente sucede que los tamaños específicos de implementación coinciden correctamente. – Lalaland

+0

Consulte también esta pregunta: http://stackoverflow.com/questions/918787/whats-sizeofsize-t-on-32-bit-vs-the-various-64-bit-data-models – ChrisWue

+0

¿Alguien puede confirmar que size_t es el mismo tamaño de los registros del procesador? – arthurprs

Respuesta

9

size_t se garantiza que sea capaz de representar el mayor tamaño posible, int no lo es. Esto significa que size_t es más portátil.

Por ejemplo, ¿qué pasa si int solo puede almacenar hasta 255 pero puede asignar matrices de 5000 bytes? Claramente esto no funcionaría, sin embargo con size_t lo hará.

+1

Técnicamente 'int' tiene que tener al menos 16 bits, como tiene que abarcar al menos el rango [-32767..32767]. (¿Por qué no? 32768? Para acomodar los sistemas de complemento de uno y de signo y magnitud, en caso de que alguien quiera usar C en una máquina antigua de Univac. Por supuesto, esos tienen números enteros de 18 y 36 bits, con 9 bits char'.) – torek

+0

@torek Por alguna razón, tengo la impresión de que int solo requiere ser> 16 en C, no en C++. Aunque no he comprobado el estándar. – Pubby

+0

@Pubby: C++ hereda eso de C. 1.1 p2 C++ es un lenguaje de programación de propósito general basado en el lenguaje de programación C como se describe en ISO/IEC 9899: 1999 Lenguajes de programación

4

El ejemplo más simple es bastante anticuado: en un viejo int sistema de 16 de bits con 64 k de RAM, el valor de un int puede estar en cualquier lugar -32.768 a 32.767, pero después de:

char buf[40960]; 

el almacenamiento intermedio buf ocupa 40 kbytes, por lo que sizeof buf es demasiado grande para caber en un int, y necesita un unsigned int.

Lo mismo puede suceder hoy en día si se utiliza 32 bits int pero permiten que los programas tengan acceso a más de 4 GB de memoria RAM a la vez, como es el caso de los llamados modelos "I32LP64" (32 bits int, 64 -bit long y puntero). Aquí el tipo size_t tendrá el mismo rango que unsigned long.

0

Es la implementación definida, pero en los sistemas de 64 bits, encontrará que size_t es a menudo de 64 bits, mientras que int sigue siendo de 32 bits (a menos que sea el modelo ILP64 or SILP64).

1

Se utiliza sobre todo para la fundición size_t punteros en enteros sin signo de la misma tamaño, para realizar cálculos en los punteros como si fueran enteros, que de otro modo se evitarían en tiempo de compilación. Tal código está destinado a compilarse y compilarse correctamente en el contexto de diferentes tamaños de puntero, p. Modelo de 32 bits frente a 64 bits.

Cuestiones relacionadas