В общем фольклоре говорится, что:
-
Система типов существует по какой-либо причине. Целые числа и указатели - это разные типы, отлитие между ними - это злоупотребление служебным положением в большинстве случаев, может указывать на ошибку дизайна и его следует избегать.
-
Даже когда такое выполнение выполняется, не предполагается никаких предположений о размере целых чисел и указателей (отличное от
void*
доint
- это самый простой способ сделать сбой кода на x64), а вместо этого изint
следует использоватьintptr_t
илиuintptr_t
изstdint.h
.
Зная, что , когда действительно полезно выполнять такие отбрасывания?
(Примечание: наличие более короткого кода для стоимости переносимости не считается "действительно полезным".)
Один случай, который я знаю:
- Некоторые блокирующие многопроцессорные алгоритмы используют тот факт, что указатель 2 + -byte-alligned имеет некоторую избыточность. Затем они используют младшие биты указателя как булевские флаги, например. С процессором, имеющим соответствующий набор команд, это может устранить необходимость в механизме блокировки (что было бы необходимо, если указатель и логический флаг были отдельными). (Примечание: эту практику можно даже безопасно выполнять на Java через java.util.concurrent.atomic.AtomicMarkableReference)
Что-нибудь еще?