golang的append 為什麼不會影響slice的位址?

時間 2021-05-08 12:16:53

1樓:

你這個位址值是變數s的位址值,肯定是永遠不變的。

切片的擴容是capx2,等x2的時候,切片裡面的array的位址才會真正變更

2樓:西豐瘦

fmt.Printf("addr:%p,len:%d,cap:%d\n",&ss,len(ss),cap(ss))

換成fmt.Printf("addr:%p,len:%d,cap:%d\n",ss,len(ss),cap(ss))就變了

3樓:Rob Zhang

funcf(

aint)b

=1f(

b)就跟上面這個呼叫無法改變變數b的值一樣。

4樓:西門吹牛

介紹參考我們都知道array是固定長度的陣列, slice是對array的擴充套件,本質上是基於陣列實現的,主要特點是定義完乙個slice變數之後,不需要為它的容量而擔心。

本文記錄直接深入slice的底層實現原理,不再介紹slice的基本使用。

slice 結構

* slice中 array 是乙個指標,它指向的是乙個array

* len 代表的是這個slice中的元素長度

* cap 是slice的容量

* [參考 Golang slice 原始碼](https://

golang.org/src/runtime/

slice.go?h=type%20slice%20struct#L13

golang.org/src/runtime/

slice.go?h=growslice#L77)效能

* 通過上面我們知道slice的擴容涉及到記憶體的拷貝,這樣帶來的好處是資料儲存在連續記憶體上,比隨機訪問快很多,最直接的效能提公升就是快取命中率會高很多,這也就是為什麼slice不採用動態鍊錶實現的原因吧

* 我們知道拷貝記憶體資料是有開銷的, 而其中最大的開銷不在 memmove 資料上,而是在開闢一塊新記憶體malloc及之後的GC壓力

* 拷貝連續記憶體是很快的,隨著cap變大,拷貝總成本還是 O(N) ,只是常數大了

* 假如不想發生拷貝,那你就沒有連續記憶體。此時隨機訪問開銷會是:鍊錶 O(N), 2倍增長塊鏈 O(LogN), 二級表乙個常數很大的 O(1)

* 當你能大致知道所需的最大空間(在大部分時候都是的)時,在make的時候預留相應的 cap 就好

* 如果需要的空間很大,而且每次都不確定,那就要在浪費記憶體和耗 CPU 在 malloc + gc 上做權衡

* 鍊錶的查詢操作是從第乙個元素開始,所以相對陣列要耗時間的多,因為採用這樣的結構對讀的效能有很大的提高

選擇* slice是很靈活的,大部分情況都能表現的很好

* 但也有特殊情況,slice的容量超大並且需要頻繁的更改slice的內容時,改用list更合適

5樓:狼大人

因為這個過程裡,你一直在覆蓋最先在棧上分配的這個 ss 物件,而這個物件並沒有被移動過。

注意看迴圈裡最後這句

這就相當於你寫

i := 0

for {

i = i + 1

一樣,&i 一直都沒有變過。

6樓:啊健

把&去掉,

package main

import "fmt"

變了吧:

addr:0xc420012220,len:3,cap:

3addr:0xc42001a120,len:4,cap:

6addr:0xc42001a120,len:5,cap:

6addr:0xc42001a120,len:6,cap:

6addr:0xc420074060,len:7,cap:

12addr:0xc420074060,len:8,cap:12

7樓:李晨曦

slice只是乙個結構體,裡面存了底層陣列的ptr,cap以及本身的len,底層陣列重新分配位址只是改變了slice裡面存的陣列位址,slice本身的位址並沒有改變。

8樓:滄桑流年

可能是在建立slice時分配的空間很多,你只是新增了幾個元素,並沒有超出空間大小,如果你新增超過所分配大小空間的元素數目,位址可能就會變了!

golang第三方庫fasthttp為什麼要使用slice而不是map來儲存header?

歲寒 我覺得問題裡別人的回答都挺好,簡而言之就是slice簡單,header引數少,沒必要放map。如果從資料結構的角度來說,可能slice相對更輕量級,比map更能充分的利用記憶體把 其實這些star多的庫沒什麼神秘的 Coldwings 為了fast,確切說是為了減少記憶體copy 因為http...

batch normalization為什麼可以防止過擬合?

程大偉 BN之所以可以防止過擬合,個人是因為將特徵進行了歸一化到同一範圍,一定程度上可以抑制雜訊 離群值 減少訓練過程中對於雜訊的過渡關注。 周塵 大概是因為某些樣本多如牛毛的訓練者說這種話,忽悠我們用batchnorm。但是實際上我們並沒有那麼大的訓練集。同時我也沒見過任何用數學理論證明它 哪怕是...

civilian population 為什麼要加population?

51語言 先看一下civilian在字典中的解釋 是描述個體的。再看形容詞 字典收錄了civilian population,可以認為這是乙個表達 平民人口 的固定用法。這裡的civilian population civilians,但是在表達層面上,優先選擇civilian population...