go - 在golang 1.17中使用原子交换指针更改指针接收器的值是否安全
问题描述
golang 1.17 从堆栈更改为注册以处理参数
当我使用 atomic.SwapPointer 更改指针接收器的值时是否安全
下面是代码
//like this
func (this *A) Replace(a *A) {
//other business logic
//....
//business logic end
atomic.SwapPointer((*unsafe.Pointer)(unsafe.Pointer(&this)), unsafe.Pointer(a))
}
解决方案
我不认为这是在做你想做的事。从 Go 代码的角度来看,即使是“明智的”不安全代码,您也无法区分寄存器和堆栈 ABI。如果您获取参数的地址,如果它还没有在内存中,它将被存储到内存中,这将是它的地址。如果将该地址传递给一个函数,该函数通过将地址存储在全局或堆中来“转义”地址,那么参数的内存实际上将通过为它分配一个槽并将其存储在那里来获得。如果发生这种情况,随后对该参数的引用将通过隐藏指针间接指向其堆地址。
推荐阅读
- mysql - Mysql auroraDb中如何高效传递40个参数
- java - 在 Java 应用程序中使用 Matlab FIS
- c# - 获取 CLR 对象属性引发无法转换类型为“System.__ComObject”的 COM 对象
- javascript - Chrome 扩展程序在第一次安装时不起作用
- angular - Angular 6 我有 2 个导航栏和不同的路线,但我必须将一个或另一个放在同一页面中
- html - 在轮播中为 img 制作 ng-repeat
- python - vscode - 从 .py 文件所在的当前文件夹读取文件
- php - 从正则表达式中获取变量
- python-3.x - 如何在代码中实现 python 字典以完成与列表函数相同的工作
- android - 尝试将数据从活动传递到片段时,我的应用程序崩溃