亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

當我們可以存儲在字符串變量中時,緩沖區的用途是什么?

當我們可以存儲在字符串變量中時,緩沖區的用途是什么?

Go
呼如林 2021-12-06 19:50:40
當我可以連接字符串時,為什么要使用緩沖區?下面的偽代碼var buffer bytes.Buffer for i := 0; i < 200; i++ {    buffer.WriteString(strconv.Itoa(i))}fmt.Println(buffer.String())對比buffer := ""for i := 0; i < 200; i++ {    buffer += strconv.Itoa(i)}fmt.Println(buffer)
查看完整描述

3 回答

?
人到中年有點甜

TA貢獻1895條經驗 獲得超7個贊

緩沖區成塊增長以分攤內存分配。

因為字符串是不可變的,所以每次循環迭代都必須分配一個新字符串。


查看完整回答
反對 回復 2021-12-06
?
Cats萌萌

TA貢獻1805條經驗 獲得超9個贊

您可以將緩沖區視為一個隊列,您可以在其中將事物排成一行。每個人都只是一個接一個地排成一排,非常高效,并且不會占用額外的空間來添加新項目。您只需插入它們即可完成。


因此,當您將 A、B、C、D、E 添加到緩沖區時,操作看起來有點像這樣的內存明智:


buffer=A

buffer=A|B

buffer=A|B|C

buffer=A|B|C|D

buffer=A|B|C|D|E

現在,如果您連接字符串,則必須分配和重新分配大量內存


 str=''

 str=Allocate(A),allocate(str+A),deallocate(str='')

 str=Allocate(B),allocate(str(''|A)+B),deallocate(str=''|A)

 str=Allocate(C),allocate(str(''|A|B)+C),deallocate(str=''|A|B)

 str=Allocate(D),allocate(str(''|A|B|C)+D),deallocate(str=''|A|B|C)

 str=Allocate(E),allocate(str(''|A|B|C|D)+E),deallocate(str=''|A|B|C|D)

如您所見,通過不斷向字符串添加一個由舊字符串組成的新字符串,然后創建新字符串并釋放舊字符串。

這會導致大量垃圾內存。當您添加緩沖區時,您只需將所有內容整齊地排列起來,而不會占用太多額外的內存。


雖然如果您連接字符串,您會不斷分配更新和更大的變量。舊字符串 + 追加字符串 + 新連接字符串。這不斷增長,不斷增長,不斷增長。

如果你有一個大文件,你逐行讀取,這可能會在一段時間后出現一些內存不足的錯誤。


查看完整回答
反對 回復 2021-12-06
?
江戶川亂折騰

TA貢獻1851條經驗 獲得超5個贊

字符串在 Go 中是不可變的。因此,第二個示例將在每次迭代時分配一個新字符串,因此運行時間為 O(n^2)。


查看完整回答
反對 回復 2021-12-06
  • 3 回答
  • 0 關注
  • 241 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號