成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

go語言存放指針,go 常用命令

golang-指針類型

tips: *號(hào),可以指向指針類型內(nèi)存地址上的值,號(hào),可以獲取值類型的內(nèi)存地址

成都創(chuàng)新互聯(lián)公司主營克井網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營網(wǎng)站建設(shè)方案,成都app開發(fā),克井h5小程序定制開發(fā)搭建,克井網(wǎng)站營銷推廣歡迎克井等地區(qū)企業(yè)咨詢

每一個(gè)變量都有內(nèi)存地址,可以通過變量來操作內(nèi)存地址中的值,即內(nèi)存的大小

go語言中獲取變量的內(nèi)存地址方法:通過 符號(hào)可以獲取變量的地址

定義:普通變量存儲(chǔ)的是對(duì)應(yīng)類型的值,這些類型就叫值類型

變量b,在內(nèi)存中的地址為:0x1040a124,在這個(gè)內(nèi)存地址上存儲(chǔ)的值為:156

定義:指針類型的變量存儲(chǔ)的是?個(gè)地址,所以?叫指針類型或引?類型

b 是值類型,它指向的是內(nèi)存地址上的值

a是指針類型,它指向的是b的內(nèi)存地址

指針類型定義,語法: var 變量名 *類型

指針類型在定義完成后,默認(rèn)為空地址,即空指針(nil)

在定義好指針變量后,可以通過***** 符號(hào)可以獲取指針變量指向的變量

在這里的 *a 等價(jià)于 b,通過修改 *a ,最終修改的是值類型b的值

這里a,d是值類型,b,c是指針類型

d就相當(dāng)于把a(bǔ)內(nèi)存地址上值,在內(nèi)存中從新開辟了一塊空間存儲(chǔ),d和a互不影響

b,c相當(dāng)于指向了a的內(nèi)存地址,當(dāng)使用*號(hào)引用出內(nèi)存地址上的變量上,修改值得,a的值也會(huì)跟著改變

Go語言使用 map 時(shí)盡量不要在 big map 中保存指針

不知道你有沒有聽過這么一句:在使用 map 時(shí)盡量不要在 big map 中保存指針。好吧,你現(xiàn)在已經(jīng)聽過了:)為什么呢?原因在于 Go 語言的垃圾回收器會(huì)掃描標(biāo)記 map 中的所有元素,GC 開銷相當(dāng)大,直接GG。

這兩天在《Mastering Go》中看到 GC 這一章節(jié)里面對(duì)比 map 和 slice 在垃圾回收中的效率對(duì)比,書中只給出結(jié)論沒有說明理由,這我是不能忍的,于是有了這篇學(xué)習(xí)筆記。扯那么多,Show Your Code

這是一個(gè)簡單的測試程序,保存字符串的 map 和 保存整形的 map GC 的效率相差幾十倍,是不是有同學(xué)會(huì)說明明保存的是 string 哪有指針?這個(gè)要說到 Go 語言中 string 的底層實(shí)現(xiàn)了,源碼在 src/runtime/string.go里,可以看到 string 其實(shí)包含一個(gè)指向數(shù)據(jù)的指針和一個(gè)長度字段。注意這里的是否包含指針,包括底層的實(shí)現(xiàn)。

Go 語言的 GC 會(huì)遞歸遍歷并標(biāo)記所有可觸達(dá)的對(duì)象,標(biāo)記完成之后將所有沒有引用的對(duì)象進(jìn)行清理。掃描到指針就會(huì)往下接著尋找,一直到結(jié)束。

Go 語言中 map 是基于 數(shù)組和鏈表 的數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)的,通過 優(yōu)化的拉鏈法 解決哈希沖突,每個(gè) bucket 可以保存 8 對(duì)鍵值,在 8 個(gè)鍵值對(duì)數(shù)據(jù)后面有一個(gè) overflow 指針,因?yàn)橥爸凶疃嘀荒苎b 8 個(gè)鍵值對(duì),如果有多余的鍵值對(duì)落到了當(dāng)前桶,那么就需要再構(gòu)建一個(gè)桶(稱為溢出桶),通過 overflow 指針鏈接起來。

因?yàn)?overflow 指針的緣故,所以無論 map 保存的是什么,GC 的時(shí)候就會(huì)把所有的 bmap 掃描一遍,帶來巨大的 GC 開銷。官方 issues 就有關(guān)于這個(gè)問題的討論, runtime: Large maps cause significant GC pauses #9477

無腦機(jī)翻如下:

如果我們有一個(gè)map [k] v,其中k和v都不包含指針,并且我們想提高掃描性能,則可以執(zhí)行以下操作。

將“ allOverflow [] unsafe.Pointer”添加到 hmap 并將所有溢出存儲(chǔ)桶存儲(chǔ)在其中。 然后將 bmap 標(biāo)記為noScan。 這將使掃描非???,因?yàn)槲覀儾粫?huì)掃描任何用戶數(shù)據(jù)。

實(shí)際上,它將有些復(fù)雜,因?yàn)槲覀冃枰獜腶llOverflow中刪除舊的溢出桶。 而且它還會(huì)增加 hmap 的大小,因此也可能需要重新整理數(shù)據(jù)。

最終官方在 hmap 中增加了 overflow 相關(guān)字段完成了上面的優(yōu)化,這是具體的 commit 地址。

下面看下具體是如何實(shí)現(xiàn)的,源碼基于 go1.15,src/cmd/compile/internal/gc/reflect.go 中

通過注釋可以看出,如果 map 中保存的鍵值都不包含指針(通過 Haspointers 判斷),就使用一個(gè) uintptr 類型代替 bucket 的指針用于溢出桶 overflow 字段,uintptr 類型在 GO 語言中就是個(gè)大小可以保存得下指針的整數(shù),不是指針,就相當(dāng)于實(shí)現(xiàn)了 將 bmap 標(biāo)記為 noScan, GC 的時(shí)候就不會(huì)遍歷完整個(gè) map 了。隨著不斷的學(xué)習(xí),愈發(fā)感慨 GO 語言中很多模塊設(shè)計(jì)得太精妙了。

差不多說清楚了,能力有限,有不對(duì)的地方歡迎留言討論,源碼位置還是問的群里大佬 _

go語言怎么輸出存放指針的數(shù)組

以下代碼在VC6.0以上版本測試通過!

輸出結(jié)果:6

#include stdio.h

int main(void)

{

int a[2][2] = {{1,2}, {3,4}};

int b[2][2] = {{5,6}, {7,8}};

int (*p1)[2] = a;

int (*p2)[2] = b;

int (*q[2])[2] = {p1, p2}; 這樣才是正確的定義!

printf("%d\n", *(*q[1]+1));

return 0;

}

但在tc2.0和bc3.1中提示非法初始化!

但把

int (*q[2])[2] = {p1, p2};

改成

int (*q[2])[2];

q[0] = p1;

q[1] = p2;

可以通過!

原因暫不清楚,估計(jì)是老舊的編譯器不支持太復(fù)雜的定義!

其實(shí)最好的方法是使用typedef,簡單明了,可讀性大大提升!

#include stdio.h

int main(void)

{

typedef int (*PA)[2]; 使用typedef

int a[2][2] = {{1,2}, {3,4}};

int b[2][2] = {{5,6}, {7,8}};

int (*p1)[2] = a;

int (*p2)[2] = b;

PA q[2]= {p1, p2}; 這樣可讀性是否大大的增加?!

printf("%d\n", *(*q[1]+1));

return 0;

}

網(wǎng)頁題目:go語言存放指針,go 常用命令
本文網(wǎng)址:http://jinyejixie.com/article36/dssogsg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站收錄、外貿(mào)建站、響應(yīng)式網(wǎng)站、品牌網(wǎng)站設(shè)計(jì)、虛擬主機(jī)網(wǎng)站制作

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都app開發(fā)公司
农安县| 华蓥市| 太仆寺旗| 绿春县| 双鸭山市| 佳木斯市| 阜南县| 新乡市| 新乡县| 平和县| 珲春市| 凤台县| 舟曲县| 元朗区| 江西省| 米林县| 莲花县| 清流县| 呈贡县| 丰城市| 建昌县| 潜江市| 蓬溪县| 托克逊县| 高要市| 通州区| 九江市| 长沙市| 金沙县| 梁河县| 北碚区| 噶尔县| 阳朔县| 阳西县| 青州市| 郸城县| 镇江市| 连山| 灵武市| 梧州市| 松江区|