如标题所描述对一下两者进行相互的装换,在不使用 copy 的情况下:
var array [1024]byte
var slice []byte
如标题所描述对一下两者进行相互的装换,在不使用 copy 的情况下:
var array [1024]byte
var slice []byte
|
1
如: array ---> slice :
slice:=array[:] 那 slice-->array? |
|
rrfengJul 8, 2020
2
不用 copy 是为啥
|
|
3
因为 copy 实际上是比较慢的
|
|
blackeeperJul 8, 2020
4
@accidentaly slice-->array [...]array := slice[:]
|
|
5
你这样写是错的把
|
|
maoxs2Jul 8, 2020 via Android
6
好像转回来必须 copy,因为 slice 地址不一定是连续的
|
|
maoxs2Jul 8, 2020 via Android
7
copy 好像不算慢吧? append 这种在需要 alloc 时候才会比较慢
|
|
8
挺慢的,我测试过了,要求性能高的最好不要 copy
|
|
9
slice 有一部分空间是没在被使用的 冗余空间,如果吧 slice 直接给转换成 array, 那部分冗余就可能会变成内存泄漏了,因为可能没有变量在持有他,所以 golang 不允许反过来的转换, unsafe 转化也是可以的 但是这样会造成泄漏 那就得不偿失了
|
|
kiwi95Jul 8, 2020 via iPhone
10
@maoxs2 slice 底层就是数组,怎么能不是连续的,slice 转最快的是定义一个和 slice 相同的 struct,然后指针转换,但可能存在越界之类的问题
|
|
kiwi95Jul 8, 2020 via iPhone
11
@kiwi95
```go func TestSlice(t *testing.T) { var s1 = []int{1, 2, 3, 4, 5} var s2 [3]int type slice struct { Arr unsafe.Pointer len int cap int } ss := *(*slice)(unsafe.Pointer(&s1)) s2 = *(*[3]int)(ss.Arr) fmt.Println("s2: ", s2) } ``` |
|
maoxs2Jul 8, 2020 via Android
12
嗯是我搞错了。reflect 里那个 SliceHeader 就是你这个 struct 了,但是这样用得用 keepalive 保留原 array 不然会被 gc
|