2010-06-06 8 views
5

Duplicar posible:
When to use std::size_t?¿Es una buena práctica usar std :: size_t en todo el lugar?

Tengo un montón de constantes en mi código que son números sin signo, por ejemplo contadores, cortes de frecuencia, longitudes, etc. Empecé a usar std::size_t para todos estos, en lugar de int o unsigned int.

¿Es eso lo correcto? Lo comencé porque los contenedores STL lo usan para sus tamaños, se usa para la posición de cadena, etc.

+0

Eso suena realmente artificial, ¿por qué no simplemente ir con int? –

+2

Efectivo duplicado de [Cuándo usar std :: size_t?] (Http://stackoverflow.com/questions/1951519/when-to-use-stdsize-t) –

+0

Ver: http://stackoverflow.com/questions/ 1951519/cuándo-para-usar-stdsize-t –

Respuesta

8

std::size_t es el tipo que se utiliza para contar ubicaciones de memoria, como longitudes de matriz, el tamaño de objetos, etc. Los contenedores STL son usando container_type::size_type, que será generalmente map to std::size_t, pero no se garantiza que lo haga.

Si necesita tipos para la celebración de las integrales no negativos que no se utilizan para los fines antes mencionados, lo que le pasa a unsigned short, unsigned int y unsigned long?

2

Puede usar size_t para las variables que representan los tamaños de los objetos almacenados en la memoria. Pero no hay muchas razones para usarlo para nada más. Existe principalmente porque unsigned int puede no ser lo suficientemente amplio como para representar el tamaño de un objeto de memoria. (Considere una arquitectura con enteros de 16 bits, sino un espacio de direcciones de 32 bits.)

3

size_t es en realidad un typedef se define en stddef.h y es dependiente de la plataforma, por lo que realmente no se puede hacer ninguna suposición sobre él. En gcc 4.4 (i486) se define como una int larga sin signo, a menos que el sistema operativo ya la defina, por ejemplo, en Free BSD 5 en una máquina i386, no tendrá firma, mientras que en una máquina ia64 será sin signo. Así, por ejemplo, si intenta hacer algo como

size_t i; 
... 
char buf[4]; 
sprintf(buf,"%u",i); 

veces es que va a funcionar, pero en algunas plataformas/compiladores que vas a conseguir un desbordamiento de búfer.

Mi punto es que esto puede causar algunos problemas de portabilidad desagradables si tiene que hacer suposiciones sobre el tamaño/tipo de size_t.

Cuestiones relacionadas