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...