Pregunta

GCC 4.4.1, C99

Estoy utilizando size_t y size_t es un unsigned int. Sin embargo, eso depende de si está ejecutando 32 bits o 64 bits.

Me va a utilizar size_t para almacenar el tamaño de una memoria intermedia.

Así que no creo que esto sería muy portátil si se utiliza en todas las arquitecturas.

Sólo una pregunta, con el uso de size_t ya sea en un 32 o 64 bits. ¿Qué situaciones podrían causar el problema más grave?

¿Fue útil?

Solución

size_t se garantiza que sea capaz de mantener el número de bytes de cualquier objeto en su aplicación. Es por eso que el tipo de retorno de sizeof es size_t.

Así que sí, es portátil.

Otros consejos

Como otros han dicho, size_t es correcta y perfectamente aceptable para almacenar el resultado de sizeof() o el tamaño de cualquier objeto representable en bytes. Lo que tienes que tener en cuenta es el siguiente:

  1. size_t es del mismo tamaño que algunos unsigned tipo entero . No es necesariamente el mismo número de bytes como el más grande de tipo entero sin signo, unsigned int, unsigned long, etc.
  2. sizeof(size_t) es un número definido por la implementación de bytes por lo memcpy'ing o asignación en cualquier tipo entero distinto de uintmax_t es una mala idea. Ni siquiera estoy seguro de que es seguro asumir que es de igual o menor tamaño que uintmax_t.
  3. Escribir un valor size_t a un archivo binario y leerlo de nuevo en un size_t por otro proceso, en una máquina diferente, o algo compilado con diferentes opciones de compilación puede ser peligroso para su salud.
  4. Envío de un valor size_t través de una red y tratando de recibirlo utilizando un tampón sizeof(size_t) en el otro lado es bastante inseguro.

Todas estas son cuestiones estándar con cualquier otro tipo entero, excepto unsigned char. Así size_t es tan portátil como cualquier otro tipo entero.

tiene sentido utilizar size_t o ssize_t para una memoria intermedia si está usando malloc () o leer (). Para un transporte utilizar SIZE_MAX, SSIZE_MAX, sizeof (tipo-en-su-buffer) y% zd o printf% zu ().

También tienes off_t y ptrdiff_t / ssize_t, que varían entre las arquitecturas de la misma manera.

Si se utilizan correctamente, entonces son arquitecturas a través de portátiles. En un sistema de 32 bits, todos ellos estarán 32 bits de ancho, mientras que en un sistema de 64 bits todos ellos serán de 64 bits de ancho. Esto es lo que quiere -. El tamaño de un tampón no puede ser cualquier más grande que un size_t de 32 bits en un sistema de 32 bits, pero puede ser mucho más grande en un sistema de 64 bits

Nunca se debe utilizar enteros, Longs, o cualquier otra cosa. Aparte de cualquier otra cosa, el tamaño de un largo varía dependiendo de la plataforma (32-bits en la mayoría de los sistemas de 32 bits, 64 bits en sistemas Unix de 64 bits, 32 bits en Windows de 64 bits).

Es difícil averiguar lo que quiere decir con "portátil" en este caso. El término "portátil" permite múltiples interpretaciones sinificantly diferentes.

Tipo size_t tiene un propósito muy específico. Puede contener el tamaño de cualquier objeto en la implementación dada. Es decir. es un tipo que puede recibir siempre el resultado de operador sizeof(). Tipo size_t no tiene otro propósito, y dentro de su aplicación prevista es 100% portátil, tan portátil como cualquier cosa puede ser.

¿Qué tipo de "portátil" que estás preguntando es, una vez más, no está claro.

No debe asumir que size_t es un entero sin signo ( ver esta respuesta ), pero creo que se tiene el mismo rango en ambas arquitecturas.

Depende de lo que está utilizando para size_t.

Si lo usa para determinar el tamaño de un búfer de memoria será seguro, ya que size_t es lo suficientemente grande como para hacer frente a toda la memoria de cualquier ordenador. Así que si el búfer de memoria es más grande que eso, usted tiene un problema de todos modos.

Por otro lado, si lo usa como un entero sin signo genérico para contar el número de estrellas en el universo, por ejemplo, es posible que tenga un problema en el sistema de 32 bits (no estoy seguro acerca de los sistemas de 64 bits).

El único problema serio real con esto está intentando acceder a un lugar amplio abanico o un gran número de size_t.

Al igual que sólo un "int" regular podría ser suficiente en un 64-bit, pero podría causar un accidente en una de 32 bits porque es demasiado grande para un int en un sistema de 32 bits.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top