Unsafe.putAddress和Unsafe.putLong方法有什么区别?

1个回答

2
Javadoc中已经非常清楚了。对于putAddress(),它说:
“在目标地址实际写入的字节数可以通过查阅#addressSize来确定。”
putLong()则将长整型值的所有位都放置。
换句话说:一个地址可能会消耗长整型值的所有位,但不一定要这样做!然后向内存中的某个位置写入64位很可能不是一个好主意!
因此,您需要能够区分这两种用例(写入n位的64位精确写入64位)。
但具体来说,在地址大小的javadoc中说:
“报告本机指针的字节大小...此值将为4或8。”
所以我想,出于所有实际目的,这两种方法是相同的。因为现在几乎所有JVM都A)实现了这些方法,并且B)是64位JVM。(因此,我认为32位JVM将返回4而不是8)。

1
我认为你是对的。但是我对 putAddress() 进行了测试,发现 addressSize() 方法总是返回 8。那么 addressSize() 方法什么时候会返回 4 呢? - kinglao
1
我检查了热点代码中的方法 addressSize(),实现始终返回 sizeof(void*) - kinglao
所以,将其作为底层C++编译器的依赖项。 - GhostCat
是的,现在很清楚了。对于方法putLong,它总是在给定地址写入一个long值。对于putAddress,如果C++编译器中的指针占用4个字节,那么即使x是一个long参数,它实际上也会占用4个字节。 - kinglao

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接