Qué es el tipo de datos uintptr t


¿Qué es uintptr_t y para qué se puede utilizar?

Author: einpoklum, 2009-12-04

4 answers

Es un int sin signo que es capaz de almacenar un puntero. Lo que normalmente significa que es del mismo tamaño que un puntero.

Se define opcionalmente en C++11 y estándares posteriores.

Una razón común para querer un tipo entero que pueda contener el tipo de puntero de una arquitectura es realizar operaciones específicas de enteros en un puntero, u ocultar el tipo de un puntero proporcionándolo como un "handle"entero.

Editar: Tenga en cuenta que Steve Jessop tiene algunos muy interesantes detalles adicionales (que no robaré) en otra respuesta aquí para ti tipos pedantes :)

 145
Author: Drew Dormann,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-03-07 23:26:41

En primer lugar, en el momento en que se hizo la pregunta, uintptr_t no estaba en C++. Está en C99, en <stdint.h>, como un tipo opcional. Muchos compiladores de C++03 proporcionan ese archivo. También está en C++11, en <cstdint>, donde de nuevo es opcional, y que se refiere a C99 para la definición.

En C99, se define como " un tipo entero sin signo con la propiedad de que cualquier puntero válido a void se puede convertir a este tipo, luego volver a convertir en puntero a void, y el resultado se comparará igual al original puntero".

Tome esto como lo que dice. No dice nada sobre el tamaño.

uintptr_t puede ser del mismo tamaño que un void*. Podría ser más grande. Podría concebiblemente ser más pequeño, aunque tal implementación de C++ se aproxima perversamente. Por ejemplo, en alguna plataforma hipotética donde void* es de 32 bits, pero solo se utilizan 24 bits de espacio de direcciones virtuales, podría tener un uintptr_t de 24 bits que satisfaga el requisito. No se por qué una implementación haría eso, pero el estándar lo permite.

 201
Author: Steve Jessop,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-11-07 13:15:25

Es un tipo entero sin signo exactamente del tamaño de un puntero. Siempre que necesite hacer algo inusual con un puntero, por ejemplo, invertir todos los bits (no pregunte por qué), lo castea a uintptr_t y lo manipula como un número entero habitual, luego cast.

 18
Author: sharptooth,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-12-04 07:56:25

Ya hay muchas buenas respuestas a la parte "qué es uintptr_t data type". Voy a tratar de abordar el "¿para qué se puede utilizar?"parte en este post.

Principalmente para operaciones bitwise en punteros. Recuerde que en C++ no se pueden realizar operaciones bitwise en punteros. Por razones ver ¿Por qué no puedes hacer operaciones bitwise en puntero en C, y hay una forma de evitar esto?

Por lo tanto, para realizar operaciones bit a bit en punteros, uno necesitaría lanzar punteros a escriba unitpr_t y luego realice operaciones bitwise.

Aquí hay un ejemplo de una función que acabo de escribir para hacer bitwise exclusive o de 2 punteros para almacenar en una lista vinculada XOR para que podamos recorrer en ambas direcciones como una lista doblemente vinculada pero sin la penalización de almacenar 2 punteros en cada nodo.

 template <typename T>
 T* xor_ptrs(T* t1, T* t2)
 {
     return reinterpret_cast<T*>(reinterpret_cast<uintptr_t>(t1)^reinterpret_cast<uintptr_t>(t2));
  }
 7
Author: BGR,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 10:31:17