ssize_t size_t c++ c size-t

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 por size_t ), ¿puedo usar ptrdiff_t forma ptrdiff_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 para size_t O se debe usar como un tipo separado de size_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 y intptr_t nombre para ptrdiff_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 e intptr_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:

  1. si el tamaño máximo de una matriz es menor que ptrdiff_t 1/2*(max number represent-able by size_t) , puedo usar ptrdiff_t forma ptrdiff_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").

  2. Si quiero declarar una variable que puede representar el desplazamiento desde otro puntero, ¿es mejor declararlo como tipo ptrdiff_t ?

  3. ¿Cómo puedo generar variables de tipo size_t y ptrdiff_t en C y C ++? ¿Es correcto lo siguiente: cadena de formato multiplataforma para variables de tipo size_t?

  4. es uintptr_t es solo otro nombre para size_t O se debe usar como un tipo separado de size_t ?

  5. ¿ ssize_t y intptr_t otros nombres para ptrdiff_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).