民间传说说:
类型系统存在是有原因的。整数和指针是不同的类型,在大多数情况下,整数和指针之间的转换是不当行为,可能表示设计错误,应避免使用。
即使执行了这样的强制转换,也不应假设整数和指针的大小(强制
void*
转换int
为使代码在x64上失败的最简单方法),而不int
应该使用intptr_t
或uintptr_t
fromstdint.h
。
知道这一点,什么时候执行这样的转换真正有用?
(注意:对于可移植性的价格,较短的代码并不算作“实际有用”。)
我知道一种情况:
- 一些无锁的多处理器算法利用了一个事实,即2个字节以上的指定指针具有一定的冗余性。例如,它们然后将指针的最低位用作布尔标志。对于具有适当指令集的处理器,这可以消除对锁定机制的需要(如果指针和布尔标志是分开的,则这是必要的)。
(注意:这种做法甚至可以通过java.util.concurrent.atomic.AtomicMarkableReference在Java中安全地进行)
更多的东西?
intptr_t
实现之间的映射是定义的实现,因此,除非我确切知道它将在哪个编译器上运行,否则我也不会使用无锁算法。