Pregunta

En varios de los ejemplos en C++ veo un uso de tipo size_t donde yo habría usado un simple int.¿Cuál es la diferencia, y por qué size_t debe ser mejor?

¿Fue útil?

Solución

De la amigable Wikipedia :

  

Los archivos de encabezado stdlib.h y stddef.h definen un tipo de datos llamado size_t que se utiliza para representar el tamaño de un objeto. Las funciones de biblioteca que toman tamaños esperan que sean del tipo size_t, y el operador sizeof se evalúa como size_t.

     

El tipo real de size_t depende de la plataforma; un error común es suponer que size_t es lo mismo que unsigned int, lo que puede conducir a errores de programación, particularmente a medida que las arquitecturas de 64 bits se vuelven más frecuentes.

Además, marque Por qué el tamaño_t importa

Otros consejos

size_t es el tipo utilizado para representar tamaños (como su nombre lo indica). Su plataforma (e incluso su implementación potencial) depende, y debe usarse solo para este propósito. Obviamente, representando un tamaño, size_t no está firmado. Muchas funciones stdlib, incluidas malloc, sizeof y varias funciones de operación de cadena, usan size_t como tipo de datos.

Un int está firmado de manera predeterminada, y aunque su tamaño también depende de la plataforma, será un fijo de 32 bits en la mayoría de las máquinas modernas (y aunque size_t es de 64 bits en la arquitectura de 64 bits, int tiene 32 bits de largo en esas arquitecturas ).

Para resumir: use size_t para representar el tamaño de un objeto y int (o long) en otros casos.

Es porque size_t puede ser cualquier cosa que no sea un int (quizás una estructura). La idea es que desacople su trabajo del tipo subyacente.

El size_t el tipo se define como el unsigned tipo integral de la sizeof operador.En el mundo real, usted verá a menudo int definido como de 32 bits (para compatibilidad con versiones anteriores), pero size_t definido como de 64 bits (así que usted puede declarar arrays y estructuras de más de 4 Gb de tamaño) en plataformas de 64 bits.Si un long int también es de 64 bits, esto se llama el LP64 convención;si long int es de 32 bits pero long long int y los punteros de 64 bits, que LLP64.Usted también puede obtener la inversa, un programa que utiliza 64 bits de instrucciones para la velocidad, pero los punteros de 32 bits para ahorrar memoria.También, int está firmado y size_t es unsigned.

Hubo históricamente un número de otras plataformas donde las direcciones eran más anchas o más corto que el tamaño nativo de int.De hecho, en los años '70 y principios de los '80, esto era más común de lo que no:todos los populares de 8 bits microcomputadoras tuvo 8-bits de los registros y 16 bits de direcciones, y la transición entre 16 y 32 bits también se producen muchos de los equipos que tenía direcciones más amplia que la de sus registros.Yo, en ocasiones, consulte las preguntas aquí sobre Borland Turbo C para MS-DOS, cuya Enorme el modo de memoria de 20 bits de direcciones almacenadas en 32 bits en una CPU de 16 bits (pero que podrían apoyar la de 32 bits con conjunto de instrucciones del 80386);el Motorola 68000 había una de 16-bit ALU con registros de 32 bits y direcciones;hubo mainframes de IBM con 15 bits, 24 bits o de 31 bits de direcciones.También ver diferentes ALU y la dirección de bus de tamaños en sistemas embebidos.

Cualquier momento int es más pequeño que size_t, y se intenta almacenar el tamaño o desplazamiento de un archivo muy grande o un objeto en un unsigned int, existe la posibilidad de que podría desbordarse y causar un error.Con un int, hay también la posibilidad de obtener un número negativo.Si un int o unsigned int es más, el programa se ejecute correctamente, pero los desechos de la memoria.

Generalmente debe usar el tipo correcto para el propósito, si usted desea portabilidad.Un montón de gente le recomendamos que utilice firmado matemáticas en lugar de unsigned (para evitar desagradables, sutiles errores como 1U < -3).Para ese propósito, la biblioteca estándar define ptrdiff_t en <stddef.h> como el firmado tipo de resultado de restar un puntero de otro.

Dicho esto, una solución podría ser la de límites de comprobar todas las direcciones y desplazamientos en contra de INT_MAX y ya sea 0 o INT_MIN según corresponda, y activar las advertencias del compilador sobre la comparación de los signed y unsigned cantidades en caso de que falte alguno.Siempre, siempre, siempre, va a comprobar su matriz de accesos para el desbordamiento en C de todos modos.

La definición de SIZE_T se encuentra en: https://msdn.microsoft.com/en-us/library/cc441980. aspx y https://msdn.microsoft.com/en- us / library / cc230394.aspx

Pegar aquí la información requerida:

ULONG_PTR es un <=> que representa el número máximo de bytes a los que puede apuntar un puntero.

Este tipo se declara de la siguiente manera:

typedef ULONG_PTR SIZE_T;

A <=> es un tipo largo sin signo utilizado para la precisión del puntero. Se utiliza cuando se convierte un puntero en un tipo largo para realizar aritmética de puntero.

Este tipo se declara de la siguiente manera:

typedef unsigned __int3264 ULONG_PTR;
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top