O que é o tipo de dados uintptr_t

O que é uintptr_t e o que pode ser usado?

É um int não assinado que é capaz de armazenar um ponteiro. Que normalmente significa que é do mesmo tamanho que um ponteiro.

É opcionalmente definido em padrões C ++ 11 e posteriores.

Um motivo comum para se desejar um tipo inteiro que possa conter um tipo de ponteiro da arquitetura é executar operações específicas de inteiros em um ponteiro ou obscurecer o tipo de um ponteiro, fornecendo-o como um inteiro “identificador”.

Edit: Note que Steve Jessop tem alguns detalhes adicionais muito interessantes (que eu não vou roubar) em outra resposta aqui para você tipos pedantes 🙂

Primeira coisa, no momento em que a pergunta foi feita, uintptr_t não estava em C ++. Está em C99, em , como um tipo opcional. Muitos compiladores C ++ 03 fornecem esse arquivo. É também em C ++ 11, em , onde novamente é opcional, e que se refere a C99 para a definição.

Em C99, ele é definido como “um tipo inteiro sem sinal com a propriedade de que qualquer ponteiro válido para void pode ser convertido para esse tipo, então convertido de volta para o ponteiro para void e o resultado será igual ao ponteiro original”.

Tome isso para significar o que diz. Não diz nada sobre tamanho.

uintptr_t pode ter o mesmo tamanho que um void* . Pode ser maior. Poderia ser concebivelmente menor, embora tal implementação de C ++ se aproxime de forma perversa. Por exemplo, em alguma plataforma hipotética em que void* é de 32 bits, mas apenas 24 bits de espaço de endereço virtual são usados, você poderia ter um uintptr_t 24 bits que satisfaz o requisito. Não sei por que uma implementação faria isso, mas o padrão permite isso.

É um tipo inteiro sem sinal exatamente o tamanho de um ponteiro. Sempre que você precisar fazer algo incomum com um ponteiro – como, por exemplo, inverter todos os bits (não pergunte por quê), você o converterá para uintptr_t e manipulará como um número inteiro usual, então retornará.

Já existem muitas boas respostas para a parte “o que é o tipo de dados uintptr_t”. Vou tentar abordar o “o que pode ser usado?” parte neste post.

Principalmente para operações bitwise em pointers. Lembre-se que em C ++ não é possível executar operações bitwise em pointers. Por razões ver Por que você não pode fazer operações bitwise no ponteiro em C, e há uma maneira de contornar isso?

Assim, para fazer operações bitwise em pointers, seria necessário converter pointers para digitar unitpr_t e, em seguida, executar operações bit a bit.

Aqui está um exemplo de uma function que acabei de escrever para fazer bitwise exclusivo ou de 2 pointers para armazenar em uma linked list XOR para que possamos percorrer em ambas as direções como uma lista duplamente vinculada, mas sem a penalidade de armazenar 2 pointers em cada nó .

  template  T* xor_ptrs(T* t1, T* t2) { return reinterpret_cast(reinterpret_cast(t1)^reinterpret_cast(t2)); }