定义指针顺序的最有效和可移植的方法是什么?

What is the most efficient and portable way to define an order on pointers?

我有一个包含指向值的指针的切片。在我的程序的性能关键部分,我在这个切片中添加或删除值。目前,插入一个值只是 appendO(1) 复杂度),移除包括在切片中搜索相应的指针值,从 0 到 n-1,直到找到指针( O(n))。为了提高性能,我想对切片中的值进行排序,以便可以使用二分法进行搜索(所以 O(log(n))。

但是我怎样才能比较指针值呢? go 中禁止指针运算,所以据我所知比较指针值 p1p2 我必须使用 unsafe 包并做类似

的事情
uintptr(unsafe.Pointer(p1)) < uintptr(unsafe.Pointer(p2))

现在,我不太习惯使用 unsafe,至少因为它的名字。那么,这种方法正确吗?它是便携式的吗?有潜在的陷阱吗?有没有更好的方法来定义指针值的顺序?我知道我可以使用地图,但地图太慢了。

正如其他人所说,不要这样做。性能对于在 Go 中诉诸指针算法来说并不是那么关键。

指针比较,Spec: Comparison operators:

Pointer values are comparable. Two pointer values are equal if they point to the same variable or if both have value nil. Pointers to distinct zero-size variables may or may not be equal.

只需使用以指针为键的映射。就那么简单。是的,索引映射比索引切片慢,但是话又说回来,如果你想保持你的切片排序并且你想在其中执行二进制搜索,那么性能差距就会缩小,因为(哈希)映射实现为你提供了O(1)查找而二分查找只是O(log n)。在大数据集的情况下,地图甚至可能比在切片中搜索更快。

如果您预计地图中有大量指针,则预分配一个大指针 make() 通过估计的上限大小,并且在您的地图超过此大小之前,不会发生重新分配。

m := make(map[*mytype]struct{}, 1<<20) // Allocate map for 1 million entries