ssize_t size_t long array c 64bit sizeof size-t

long - ¿Cuál es sizeof(size_t) en 32 bits frente a los diversos modelos de datos de 64 bits?



ssize_t (4)

En un sistema de 64 bits, sizeof(unsigned long) depende del modelo de datos implementado por el sistema, por ejemplo, tiene 4 bytes en LLP64 (Windows), 8 bytes en LP64 (Linux, etc.). ¿Qué se supone que es sizeof(size_t) ? ¿Varía con el modelo de datos como sizeof(long) does? ¿Si es así, cómo?

Referencias

Modelos de datos de 64 bits en Wikipedia


debería variar con la arquitectura porque representa el tamaño de cualquier objeto. Por lo tanto, en un tamaño de sistema de 32 bits, es probable que tenga al menos 32 bits de ancho. En un sistema de 64 bits, es probable que tenga al menos un ancho de 64 bits.


size_t es de 64 bits normalmente en la máquina de 64 bits


size_t se define por el estándar C como el tipo de retorno entero sin signo del operador sizeof (C99 6.3.5.4.4) y el argumento de malloc y amigos (C99 7.20.3.3 etc.). El rango real se establece de manera que el máximo (SIZE_MAX) sea al menos 65535 (C99 7.18.3.2).

Sin embargo, esto no nos permite determinar sizeof (size_t). La implementación es libre de usar cualquier representación que le guste para size_t, por lo que no hay límite superior en el tamaño, y la implementación también es libre de definir un byte como 16 bits, en cuyo caso size_t puede ser equivalente a char sin signo.

Sin embargo, dejando de lado eso, en general tendrá size_t de 32 bits en programas de 32 bits y programas de 64 bits en 64 bits, independientemente del modelo de datos. En general, el modelo de datos solo afecta a los datos estáticos; por ejemplo, en GCC:

`-mcmodel=small'' Generate code for the small code model: the program and its symbols must be linked in the lower 2 GB of the address space. Pointers are 64 bits. Programs can be statically or dynamically linked. This is the default code model. `-mcmodel=kernel'' Generate code for the kernel code model. The kernel runs in the negative 2 GB of the address space. This model has to be used for Linux kernel code. `-mcmodel=medium'' Generate code for the medium model: The program is linked in the lower 2 GB of the address space but symbols can be located anywhere in the address space. Programs can be statically or dynamically linked, but building of shared libraries are not supported with the medium model. `-mcmodel=large'' Generate code for the large model: This model makes no assumptions about addresses and sizes of sections.

Observará que los punteros son de 64 bits en todos los casos; y no tiene mucho sentido tener punteros de 64 bits pero no de 64 bits, después de todo.


EDITAR: Gracias por los comentarios. Lo busqué en el estándar C99 , que dice en la sección 6.5.3.4:

El valor del resultado está definido por la implementación, y su tipo (un tipo de entero sin signo ) es size_t , definido en <stddef.h> (y otros encabezados)

Por lo tanto, no se especifica el tamaño de size_t , solo que tiene que ser un tipo de entero sin signo. Sin embargo, una especificación interesante se puede encontrar en el capítulo 7.18.3 de la norma:

límite de size_t

SIZE_MAX 65535

Lo que básicamente significa que, independientemente del tamaño de size_t , el rango de valores permitido es de 0-65535, el resto depende de la implementación.