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