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

3 minutos de lectura

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


Referencias:

Modelos de datos de 64 bits en Wikipedia

size_t está definido por el estándar C como el tipo de retorno de 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 desee para size_t, por lo que no hay un 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 firmar.

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

`-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.

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

avatar de usuario
Evan Terán

debe variar con la arquitectura porque representa el tamaño de cualquier objeto. Así que en un sistema de 32 bits size_t probablemente tendrá al menos 32 bits de ancho. En un sistema de 64 bits, es probable que tenga al menos 64 bits de ancho.

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

avatar de usuario
carne2k

EDITAR: Gracias por los comentarios – Lo busqué en el estándar C99que dice en el apartado 6.5.3.4:

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

Entonces, el tamaño de size_t no se especifica, solo que tiene que ser un tipo entero sin signo. Sin embargo, se puede encontrar una especificación interesante en el capítulo 7.18.3 del estándar:

limite de size_t

SIZE_MAX 65535

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

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad