gpt4 book ai didi

go - 仅在 slice 的第一个元素上保留 unsafe.Pointer 并且没有对该 slice 本身的引用是否安全?

转载 作者:IT王子 更新时间:2023-10-29 02:23:14 25 4
gpt4 key购买 nike

package main

import (
"fmt"
"unsafe"
"runtime"
)

func getPoi() unsafe.Pointer {
var a = []int{1, 2, 3}
return unsafe.Pointer(&a[0])
}

func main() {
p := getPoi()
runtime.GC()
fmt.Println("Hello, playground %v\n", *(*int)(unsafe.Pointer(uintptr(p)+8)))
}

输出:3

https://play.golang.org/p/-OQl7KeL9a

只是检查不安全指针的能力,尽量减少 slice 结构的内存开销(12 字节)

我想知道这个例子是否正确。如果没有,那么在采取这些行动之后究竟会出什么问题。如果不正确,为什么即使在显式调用 GC 后该值仍然可用?是否有任何方法可以达到最小的存储开销,如“slice 的 slice ”,就像在 C 中一样(只是指向分配数组的指针数组,当每行的开销为 sizeof(int*) 时)。

最佳答案

有可能,巧合的是,这对你有用,但我认为它不安全且不受支持。问题是,如果 slice 超出其容量并且需要重新分配,那么您的指针会发生什么情况?真的,如果你想优化性能,你应该使用数组。除了其固有的更好的性能和更小的内存占用之外,此操作始终是安全的。

此外,一般来说,我看到人们在设计本身就很差(比如无缘无故地使用动态数组或链表)时,会做各种愚蠢的事情来尝试提高性能。如果您需要 slice 的动态增长,那么数组并不是一个真正的选择(并且使用该指针也很可能是不安全的)但在许多情况下,开发人员只是出于 idk,懒惰而无法适本地调整其集合的大小?我假设你的例子是人为的,但在这种情况下你没有理由使用 slice ,因为你的集合大小在编译时是已知的。即使不是,通常可以在分配之前在运行时确定大小,而人们只是为了方便使用抽象的动态大小的集合而没有这样做。

关于go - 仅在 slice 的第一个元素上保留 unsafe.Pointer 并且没有对该 slice 本身的引用是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37029966/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com