Во-первых, во время, когда был задан вопрос, uintptr_t
не было в C ++. Это в C99, в <stdint.h>
, как необязательный тип. Многие компиляторы C ++ 03 предоставляют этот файл. Это также в C ++ 11, в <cstdint>
, где опять-таки это необязательно, и который ссылается на C99 для определения.
В C99 это определяется как «целочисленный тип без знака со свойством, что любой действительный указатель на void может быть преобразован в этот тип, затем преобразован обратно в указатель на void, и результат будет сравниваться с исходным указателем» .
Примите это, чтобы означать, что это говорит. Это ничего не говорит о размере.
uintptr_t
может быть того же размера, что и void*
. Это может быть больше. Вероятно, он может быть меньше, хотя такая реализация на C ++ подходит извращенно. Например, на некоторой гипотетической платформе, где void*
составляет 32 бита, но используется только 24 бита виртуального адресного пространства, вы можете иметь 24-битный uintptr_t
, который удовлетворяет требованию. Я не знаю, почему реализация сделала бы это, но стандарт разрешает это.