Когда приведение указателя типа integer <-> действительно правильно?

В народном фольклоре говорится, что:

  • Система типов существует не просто так. Целые числа и указатели относятся к разным типам, преобразование между ними в большинстве случаев является злоупотреблением, может указывать на ошибку проектирования, и его следует избегать.

  • Даже когда такое преобразование выполняется, нельзя делать никаких предположений о размере целых чисел. и указатели (приведение void * к int - самый простой способ заставить код выйти из строя на x64), а вместо int следует использовать intptr_t или uintptr_t из stdint.h .

Зная это, когда на самом деле полезно выполнять такое приведение?

(Примечание: наличие немного более короткого кода по цене переносимости не считается «действительно полезным».)


Один известный мне случай:

  • Некоторые многопроцессорные алгоритмы без блокировки использовать тот факт, что указатель, состоящий из 2+ байтов, имеет некоторую избыточность. Затем они используют, например, младшие биты указателя как логические флаги. С процессором, имеющим соответствующий набор инструкций, это может устранить необходимость в механизме блокировки (который был бы необходим, если бы указатель и логический флаг были разделены).
    (Примечание: эту практику можно безопасно выполнять даже в Java через java.util.concurrent.atomic.AtomicMarkableReference)

Что-нибудь еще?

77
задан Kos 25 August 2011 в 11:07
поделиться