【发布时间】:2018-02-14 13:34:50
【问题描述】:
我有一个包含指向值的指针的切片。在我的程序的一个性能关键部分,我在这个切片中添加或删除值。目前,插入一个值只是append(O(1) 复杂度),而删除是在切片中搜索相应的指针值,从 0 到 n-1,直到找到指针(O(n)) .为了提高性能,我想对切片中的值进行排序,以便可以使用二分法进行搜索(所以O(log(n))。
但是如何比较指针值呢? go 中禁止指针运算,因此 AFAIK 比较指针值 p1 和 p2 我必须使用 unsafe 包并执行类似的操作
uintptr(unsafe.Pointer(p1)) < uintptr(unsafe.Pointer(p2))
现在,我不习惯使用unsafe,至少因为它的名字。那么,这种方法正确吗?它是便携式的吗?有没有潜在的陷阱?有没有更好的方法来定义指针值的顺序?我知道我可以使用地图,但是地图非常慢。
【问题讨论】:
-
语言规范不能保证指针值是什么,即使它们在程序执行期间会保持不变(因此压缩垃圾收集不是不可能的)。因此,将指针用作指向值以外的任何东西是一个非常糟糕的主意。一定要切片吗?由于指针的排序无论如何都是没有意义的,你唯一实现的就是唯一性,你不能用地图来代替吗?
-
谢谢@Art。我尝试使用地图,但在这种情况下它们比切片要慢。
标签: pointers go unsafe-pointers