Estoy tan confundido size_t
. He buscado en Internet y en todas partes mencioné que size_t
es un tipo sin firmar, por lo que solo puede representar valores no negativos.
Mi primera pregunta es: si se usa para representar solo valores no negativos, ¿por qué no lo usamos en unsigned int
lugar de size_t
?
La segunda pregunta es: ¿ size_t
y unsigned int
intercambiables o no? Si no es así, ¿por qué?
¿Y alguien puede darme un buen ejemplo size_t
y brevemente de su funcionamiento?
typedef /*This part is implementation dependent */ size_t;
Respuestas:
Porque
unsigned int
no es el único tipo de entero sin signo.size_t
podría ser cualquiera deunsigned char
,unsigned short
,unsigned int
,unsigned long
ounsigned long long
, dependiendo de la aplicación.No son intercambiables, por el motivo explicado anteriormente
^^
.No entiendo muy bien lo que quieres decir con "su breve trabajo". Funciona como cualquier otro tipo sin firmar (en particular, como el tipo al que está escrito). Se le anima a usar
size_t
cuando describa el tamaño de un objeto. En particular, elsizeof
operador y varias funciones de biblioteca estándar, comostrlen()
returnsize_t
.Bono: aquí hay un buen artículo sobre
size_t
(y elptrdiff_t
tipo más relacionado ). Razona muy bien por qué debería usarlo.fuente
size_t
ser ununsigned char
? ¿Está esto en el estándar que está permitido? Quiero decir, con esa idea, ¿cómo se puede esperar que alguien usecalloc()
(y una familia),strlen()
etc.? Eso me parece absurdo.size_t
está definido en el estándar como un "tipo entero sin signo", pero no requiere que sea igual a cualquiera deunsigned {char, short, int, long, long long}
.Hay 5 tipos de enteros sin signo estándar en C:
unsigned char
unsigned short
unsigned int
unsigned long
unsigned long long
con varios requisitos para sus tamaños y rangos (brevemente, el rango de cada tipo es un subconjunto del rango del siguiente tipo, pero algunos de ellos pueden tener el mismo rango).
size_t
es untypedef
(es decir, un alias) para algún tipo sin signo (probablemente uno de los anteriores, pero posiblemente un tipo entero sin signo extendido , aunque eso es poco probable). Es el tipo cedido por elsizeof
operador.En un sistema, podría tener sentido usarlo
unsigned int
para representar tamaños; en otro, podría tener más sentido usarunsigned long
ounsigned long long
. (size_t
es poco probable que seaunsigned char
ounsigned short
, pero está permitido).El propósito de
size_t
es aliviar al programador de tener que preocuparse por qué de los tipos predefinidos se usa para representar tamaños.Código que asume
sizeof
rendimientosunsigned int
y no sería portátil.size_t
Es más probable que el código que asume que produce una sea portátil.fuente
unsigned int
,unsigned long
, etc.) quesize_t
corresponde a depende de la máquina en la que se ejecuta el código? es decir, en una arquitectura de máquina, correspondeunsigned int
pero en otra arquitectura corresponderáunsigned long
, etc.size_t
, especialmente si, por ejemplo,unsigned long
yunsigned long long
tienen el mismo tamaño.long
,long long
etc. depende del sistema: si le echas un vistazolimits.h
, al menos en Unices verás que el valor máximo de ints depende del tamaño de palabra del sistema.size_t
tiene una restricción específica.Citando de http://www.cplusplus.com/reference/cstring/size_t/ :
No es intercambiable con
unsigned int
porque el tamaño deint
lo especifica el modelo de datos. Por ejemplo, LLP64 usa 32 bitsint
e ILP64 usa 64 bitsint
.fuente
size_t se utiliza para almacenar tamaños de objetos de datos y se garantiza que puede contener el tamaño de cualquier objeto de datos que la implementación de C particular pueda crear. Este tipo de datos puede ser más pequeño (en número de bits), más grande o exactamente igual que unsigned int.
fuente
Aparte de las otras respuestas, también documenta el código y le dice a la gente que está hablando del tamaño de los objetos en la memoria.
fuente
apple
es una manzana , asize_t
es un tamaño ...size_t type es un tipo de entero sin signo base del lenguaje C / C ++. Es el tipo de resultado devuelto por el operador sizeof. El tamaño del tipo se elige para que pueda almacenar el tamaño máximo de una matriz teóricamente posible de cualquier tipo. En un sistema de 32 bits, size_t tomará 32 bits, en uno de 64 bits, 64 bits. En otras palabras, una variable de tipo size_t puede almacenar un puntero de forma segura. La excepción son los punteros a las funciones de clase, pero este es un caso especial. Aunque size_t puede almacenar un puntero, es mejor usar otro tipo de entero sin signo uintptr_t para ese propósito (su nombre refleja su capacidad). Los tipos size_t y uintptr_t son sinónimos. El tipo size_t se usa generalmente para contadores de bucles, indexación de matrices y aritmética de direcciones. El valor máximo posible del tipo size_t es constante SIZE_MAX.
fuente
size_t
puede almacenar el tamaño de cualquier objeto. Un puntero puede apuntar a cualquier byte de cualquier objeto. Puede tener un sistema con, por ejemplo, un espacio de direcciones de 64 bits que limita el tamaño de cualquier objeto a 2 ** 32-1 bytes. No hay garantía de quesize_t
yuintptr_t
sean del mismo tipo.En palabras simples, size_t depende de la plataforma y de la implementación, mientras que unsigned int solo depende de la plataforma.
fuente