Каков идиоматический способ определения ограничений указателя в C ++?

Я хотел бы знать во время компиляции диапазон значений для типа указателя. limits.h определяет только максимумы и минимумы для чистых числовых типов. Я не хочу использовать жестко запрограммированные константы и предпочитаю не вычислять максимум с помощью sizeof(foo*).


person Dhskjlkakdh    schedule 15.07.2010    source источник
comment
Объясните проблему, которую вы пытаетесь решить, вместо того, чтобы спрашивать, как реализовать выбранное вами решение. Я чувствую здесь что-то очень резкое.   -  person Amardeep AC9MF    schedule 15.07.2010
comment
Вы хотите, чтобы компилятор определял, сколько памяти доступно в системе ??   -  person Edward Strange    schedule 15.07.2010
comment
За исключением NULL, фактические значения в указателях должны быть непрозрачными. Даже NULL не гарантирует наличия какого-либо битового шаблона, просто он уникален. Если вы просто хотите узнать 32-битную или 64-битную архитектуру, есть #defines, зависящие от компилятора, которые вам это скажут.   -  person Eclipse    schedule 15.07.2010
comment
re: Amardeep, шаблонный класс-контейнер trie параметризуется по максимальному и минимальному значениям типа, используемого в качестве токена предоставленного им типа ключа. Я хотел бы использовать список указателей в качестве ключевого типа, поэтому указываю указатель в качестве типа токена. Для выполнения параметризации мне нужен диапазон допустимых значений указателя.   -  person Dhskjlkakdh    schedule 15.07.2010
comment
Почему вы не хотите вычислять максимум, используя sizeof?   -  person James McNellis    schedule 15.07.2010
comment
re: Джеймс Макнеллис, это кажется неправильным способом сделать это. Но если вы думаете, что это лучшее решение, тогда напишите его как ответ на вопрос.   -  person Dhskjlkakdh    schedule 15.07.2010
comment
@sjbach, хотя это вполне оправданный ответ, мне все еще кажется, что имеет место «злоупотребление указателем» без адекватного объяснения причин. Объясните, какую проблему вы пытаетесь решить с помощью этого указателя / дерева, и кто-нибудь может предложить более традиционный способ решения проблемы без использования указателей таким образом, чтобы они не предназначались для использования. Вы просите идиоматическую реализацию очень неидиоматического подхода к проектированию.   -  person Amardeep AC9MF    schedule 15.07.2010
comment
Amardeep, я сопоставляю строку объектов значениям. Ожидаемый состав строки объектов предполагает, что поиск в дереве выполняется быстрее, чем поиск по хешу. Но было бы слишком дорого включать специальный член-токен в этот класс объекта специально для поиска в trie; поэтому мне удобно использовать значения указателей на объекты, поскольку они легко и эффективно сопоставимы.   -  person Dhskjlkakdh    schedule 16.07.2010
comment
@sjbach: я подозреваю, что ваш класс контейнера trie в любом случае будет интерпретировать указатели как целые числа, и в этом случае вычисления на основе sizeof (foo *) в порядке. Как это дерево будет работать? Что составляет одну «букву», один байт?   -  person Joseph Garvin    schedule 16.07.2010


Ответы (2)


Думаю, я бы использовал intptr_t. Он определяется как целое число, которое может содержать значение указателя, поэтому минимальные / максимальные значения intptr_t должны работать.

Он может быть больше, чем значение фактического указателя. Но из вашего объяснения класса, которому нужны только минимальные / максимальные значения, я не верю, что вам нужна полная точность.

person Zan Lynx    schedule 15.07.2010
comment
Обратите внимание, что intptr_t в настоящее время не является частью C ++; он был добавлен в C в C99 и будет присутствовать в грядущем стандарте C ++ 0x. - person James McNellis; 15.07.2010

Указатели - это не числа. В частности, они не совсем упорядочены - учитывая два случайных указателя p и q, вы не можете вычесть один из другого и получить значимый результат - это UB, если они оба не указывают на один и тот же объект (блок памяти malloc, статический или автоматический объект и т. д.). Таким образом, концепция разрешенного диапазона указателей бессмысленна в Стандартном C ++.

person Pavel Minaev    schedule 15.07.2010
comment
Это информативно, но я не уверен, что это уместно. Единственная выполняемая арифметика указателя - это сравнение, и согласно этот ответ, указатели на отдельные объекты безопасно и последовательно сопоставимы с std::less<>. Предположительно, если есть абсолютный порядок, существует также абсолютный диапазон. - person Dhskjlkakdh; 16.07.2010
comment
Применение операторов < и > в этом случае также будет неопределенным. Но на самом деле это хороший момент в отношении std::less - хотя он не должен определяться в терминах < для указателей (в Стандарте это довольно ясно) - он по-прежнему определяет абсолютный порядок и, следовательно, диапазон. Однако ему не нужно сопоставлять фактические адреса, и я почти уверен, что нет никакого способа узнать минимальное и максимальное (в терминах std::less) значения, не перечислив их все. - person Pavel Minaev; 16.07.2010