tl;dr 存在指针 ffi与native交互时常使用
如果单从表示一块内存区域首地址的角度来看实际上是存在的
https://b23.tv/9hFRkQl其中的
MemoryAddress即代表一个指针 对其可以取偏移量做各种操作
我猜测 不让你直接用裸指针原因
1,gc移动对象你的指针不一定准确
2,乱用指针会导致jvm崩溃
这些实际上只能够对应上指针实际上就是储存内存地址这个概念
对于指针的自增操作会前进对应步长这一部分 则是需要MemorySegement和layout共同完成,某种意义也可以复刻一下指针自增操作
当我们不考虑指针越界等内存无效的场景时,在c中经常存在的指针强转或者直接给一个值作为指针值的操作 在新的ffi中也是允许的
说回堆内的情况 jvm允许你解一个指针找到对应的jvm对象 允许你修改其指向,但是通过类型系统限制了指针类型的自由转换,以及完全关闭了用户侧指针的算术操作,尽可能因用户操作失误导致的内存无效情况
即java/jvm提供了一套可能比较别扭的堆外指针体系和一套受限的堆内指针体系
最后骂一句 新的ffi没给栈上分配的api 就导致我要跟二重指针交互 需要在堆上开一个空间放指针的值 也不知道jit能不能有优化掉这个case
反正没人看 贴个情绪的图
|