c++ - ssize_t - variables de tipo size_t y ptrdiff_t
size_t c (3)
1: si el tamaño máximo de una matriz es menor que
ptrdiff_t
* (número máximo representable porsize_t
), ¿puedo usarptrdiff_t
formaptrdiff_t
y verificar las distancias relativas entre dos punteros al mismo objeto?
Ese será el caso si sizeof(size_t) <= sizeof(prtdiff_t)
. Ese será el caso en una implementación sensata, pero no hay garantía.
2: si quiero declarar una variable que puede representar el desplazamiento desde otro puntero, es mejor que lo declare como tipo
ptrdiff_t
?
Sí, para eso está destinado el tipo.
3: ¿Cómo puedo generar variables de tipo size_t y ptrdiff_t en C y C ++?
Cía:
printf("%zu %td/n", size, ptrdiff);
En C ++:
std::cout << size << '' '' << ptrdiff << ''/n'';
4: es
uintptr_t
es solo otro nombre parasize_t
O se debe usar como un tipo separado desize_t
?
Debe ser considerado como un tipo separado. uintptr_t
es un tipo entero que puede contener cualquier valor de puntero convertido en un entero; Puede que no exista en algunas plataformas.
5: es
ssize_t
yintptr_t
nombre paraptrdiff_t
O tiene que ser usado de manera diferente?
ssize_t
no es un tipo estándar en lo que respecta a los lenguajes C o C ++; Posix lo define como el tipo de algunos argumentos de función y valores de retorno. Sería mejor usar ptrdiff_t
excepto cuando se trate directamente de las funciones de Posix.
intptr_t
está diseñado para mantener una representación entera de un puntero, no una diferencia entre los punteros. En algunas plataformas, estos pueden tener diferentes tamaños, e intptr_t
puede no estar definido en absoluto, por lo que no deben usarse indistintamente.
Quiero ser capaz de usar compensaciones negativas. ¿Y alguna diferencia en el uso de
uintptr_t
eintptr_t
?
No utilice ninguno de estos tipos para representar las compensaciones; utilizar ptrdiff_t
. Utilice estos tipos en circunstancias especiales, cuando quiera convertir los punteros a sus representaciones de enteros por alguna razón.
Al leer en las publicaciones en línea relacionadas con size_t
y ptrdiff_t
, quiero confirmar lo siguiente:
si el tamaño máximo de una matriz es menor que
ptrdiff_t
1/2*(max number represent-able by size_t)
, puedo usarptrdiff_t
formaptrdiff_t
y verificar las distancias relativas entre dos punteros hacia el mismo objeto (ya que estaba hablando de matriz, "punteros al mismo objeto" significa "punteros a la misma matriz").Si quiero declarar una variable que puede representar el desplazamiento desde otro puntero, ¿es mejor declararlo como tipo
ptrdiff_t
?¿Cómo puedo generar variables de tipo
size_t
yptrdiff_t
en C y C ++? ¿Es correcto lo siguiente: cadena de formato multiplataforma para variables de tipo size_t?es
uintptr_t
es solo otro nombre parasize_t
O se debe usar como un tipo separado desize_t
?¿
ssize_t
yintptr_t
otros nombres paraptrdiff_t
O tienen que ser usados de manera diferente?
Estoy empezando a usar gcc en Ubuntu. Acabo de enterarme de estos tipos cuando uso los códigos de otra persona.
AGREGADO: Quiero poder usar compensaciones negativas . ¿Y alguna diferencia en el uso de uintptr_t
e intptr_t
?
Suponiendo que _ptrdiff_t_
es un error tipográfico:
1) si. Si el tamaño máximo de una matriz es menor que SIZE_MAX/2
, puede usar ptrdiff_t
forma ptrdiff_t
2) A veces: ptrdiff_t
suele ser la diferencia entre dos punteros, mientras que size_t
es un desplazamiento. Lo importante aquí es que size_t
siempre es positivo, ptrdiff_t
puede ser negativo. Tenga en cuenta que en algunas plataformas, pueden ser de tamaños muy diferentes.
3) Usted ptrdiff_t
variables de tipo size_t
y ptrdiff_t
la misma manera que ptrdiff_t
cualquier otro tipo de variable.
size_t a = 10;
ptrdiff_t b = 20;
printf("%u %d", ((unsigned int)a), ((int)b));
std::cout << a << b;
4) uintptr_t
es un entero sin signo al menos tan grande como un int*
, para permitir de forma segura la matemática de enteros en los punteros. No se garantiza que size_t
sea el mismo por lo que puedo decir.
5) ssize_t
es un tipo C no estándar, correspondiente a ptrdiff_t
. Utilice ptrdiff_t
en ptrdiff_t
lugar. ( On platforms supporting the POSIX 1003.1-1996 API standard, which includes most Unix-like systems, a signed variant of size_t named ssize_t is available, which was not part of the ANSI or ISO C standards.
http://en.wikipedia.org/wiki/Size_t )
uintptr_t
e intptr_t
son lo suficientemente grandes como para contener cualquier void*
puntero void*
sin pérdida de información. Deben poder representar de forma única la dirección de cualquier objeto en todo el espacio de direcciones de su programa, incluido cualquier byte dentro de cualquier objeto.
size_t
es el tipo generado por el operador sizeof
; ptrdiff_t
es el tipo ptrdiff_t
al restar dos punteros. Solo necesitan ser lo suficientemente grandes para un solo objeto. (Y es posible tener un objeto tan grande que al desbordar dos punteros que apuntan a extremos opuestos se desbordará).
La mayoría de los sistemas actuales tienen un único espacio de direcciones monolíticas, pero C está diseñado para funcionar en sistemas que no lo hacen. Por ejemplo, en algunos sistemas, el objeto más grande posible podría ser una pequeña fracción del tamaño de todo el espacio de direcciones, y comparar o restar los punteros a objetos distintos podría carecer de sentido. (Piense en un esquema de direccionamiento segmentado, donde la resta y la comparación de punteros consideran solo la parte de desplazamiento de la dirección).