go語言讀取文件偏移 go 文件讀寫

Go語言中恰到好處的內存對齊

在開始之前,希望你計算一下 Part1 共占用的大小是多少呢?

目前成都創新互聯公司已為上1000+的企業提供了網站建設、域名、網頁空間、網站運營、企業網站設計、阜南網站維護等服務,公司將堅持客戶導向、應用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協力一起成長,共同發展。

輸出結果:

這么一算, Part1 這一個結構體的占用內存大小為 1+4+1+8+1 = 15 個字節。相信有的小伙伴是這么算的,看上去也沒什么毛病

真實情況是怎么樣的呢?我們實際調用看看,如下:

輸出結果:

最終輸出為占用 32 個字節。這與前面所預期的結果完全不一樣。這充分地說明了先前的計算方式是錯誤的。為什么呢?

在這里要提到 “內存對齊” 這一概念,才能夠用正確的姿勢去計算,接下來我們詳細的講講它是什么

有的小伙伴可能會認為內存讀取,就是一個簡單的字節數組擺放

上圖表示一個坑一個蘿卜的內存讀取方式。但實際上 CPU 并不會以一個一個字節去讀取和寫入內存。相反 CPU 讀取內存是 一塊一塊讀取 的,塊的大小可以為 2、4、6、8、16 字節等大小。塊大小我們稱其為 內存訪問粒度 。如下圖:

在樣例中,假設訪問粒度為 4。 CPU 是以每 4 個字節大小的訪問粒度去讀取和寫入內存的。這才是正確的姿勢

另外作為一個工程師,你也很有必要學習這塊知識點哦 :)

在上圖中,假設從 Index 1 開始讀取,將會出現很崩潰的問題。因為它的內存訪問邊界是不對齊的。因此 CPU 會做一些額外的處理工作。如下:

從上述流程可得出,不做 “內存對齊” 是一件有點 "麻煩" 的事。因為它會增加許多耗費時間的動作

而假設做了內存對齊,從 Index 0 開始讀取 4 個字節,只需要讀取一次,也不需要額外的運算。這顯然高效很多,是標準的 空間換時間 做法

在不同平臺上的編譯器都有自己默認的 “對齊系數”,可通過預編譯命令 #pragma pack(n) 進行變更,n 就是代指 “對齊系數”。一般來講,我們常用的平臺的系數如下:

另外要注意,不同硬件平臺占用的大小和對齊值都可能是不一樣的。因此本文的值不是唯一的,調試的時候需按本機的實際情況考慮

輸出結果:

在 Go 中可以調用 unsafe.Alignof 來返回相應類型的對齊系數。通過觀察輸出結果,可得知基本都是 2^n ,最大也不會超過 8。這是因為我手提(64 位)編譯器默認對齊系數是 8,因此最大值不會超過這個數

在上小節中,提到了結構體中的成員變量要做字節對齊。那么想當然身為最終結果的結構體,也是需要做字節對齊的

接下來我們一起分析一下,“它” 到底經歷了些什么,影響了 “預期” 結果

在每個成員變量進行對齊后,根據規則 2,整個結構體本身也要進行字節對齊,因為可發現它可能并不是 2^n ,不是偶數倍。顯然不符合對齊的規則

根據規則 2,可得出對齊值為 8。現在的偏移量為 25,不是 8 的整倍數。因此確定偏移量為 32。對結構體進行對齊

Part1 內存布局:axxx|bbbb|cxxx|xxxx|dddd|dddd|exxx|xxxx

通過本節的分析,可得知先前的 “推算” 為什么錯誤?

是因為實際內存管理并非 “一個蘿卜一個坑” 的思想。而是一塊一塊。通過空間換時間(效率)的思想來完成這塊讀取、寫入。另外也需要兼顧不同平臺的內存操作情況

在上一小節,可得知根據成員變量的類型不同,其結構體的內存會產生對齊等動作。那假設字段順序不同,會不會有什么變化呢?我們一起來試試吧 :-)

輸出結果:

通過結果可以驚喜的發現,只是 “簡單” 對成員變量的字段順序進行改變,就改變了結構體占用大小

接下來我們一起剖析一下 Part2 ,看看它的內部到底和上一位之間有什么區別,才導致了這樣的結果?

符合規則 2,不需要額外對齊

Part2 內存布局:ecax|bbbb|dddd|dddd

通過對比 Part1 和 Part2 的內存布局,你會發現兩者有很大的不同。如下:

仔細一看, Part1 存在許多 Padding。顯然它占據了不少空間,那么 Padding 是怎么出現的呢?

通過本文的介紹,可得知是由于不同類型導致需要進行字節對齊,以此保證內存的訪問邊界

那么也不難理解,為什么 調整結構體內成員變量的字段順序 就能達到縮小結構體占用大小的疑問了,是因為巧妙地減少了 Padding 的存在。讓它們更 “緊湊” 了。這一點對于加深 Go 的內存布局印象和大對象的優化非常有幫

golang (*bufio.Reader)的讀取方法

bufReader.ReadBytes('\n')和 bufReader.ReadString('\n')在讀到文件最后一行時,會同時返回內容line和io.EOF。而bufReader.Read()讀取到末尾時,會先返回內容,然后再下一次迭代時才返回io.EOF

golang 如何在ini文件指定位置 寫入字符串

1、C語言標準庫提供了一系列文件操作函數。文件操作函數一般以f+單詞的形式來命名(f是file的簡寫),其聲明位于stdio.h頭文件當中。例如:fopen、fclose函數用于文件打開與關閉;fscanf、fgets函數用于文件讀取;fprintf、fputs函數用于文件寫入;ftell、fseek函數用于文件操作位置的獲取與設置。一般的C語言教程都有文件操作一章,可以找本教材進一步學習。2、例程:

#includestdio.hint a;char b,c[100];int main(){ FILE * fp1 = fopen("input.ini", "r");//打開輸入文件 FILE * fp2 = fopen("output.ini", "w");//打開輸出文件 if (fp1==NULL || fp2==NULL) {//若打開文件失敗則退出 puts("不能打開文件!"); rturn 0; } fscanf(fp1,"%d",a);//從輸入文件讀取一個整數 b=fgetc(fp1);//從輸入文件讀取一個字符 fgets(c,100,fp1);//從輸入文件讀取一行字符串 printf("%ld",ftell(fp1));//輸出fp1指針當前位置相對于文件首的偏移字節數 fputs(c,fp2);//向輸出文件寫入一行字符串 fputc(b,fp2);//向輸出文件寫入一個字符 fprintf(fp2,"%d",a);//向輸出文件寫入一個整數 fclose(fp1);//關閉輸入文件 fclose(fp2);//關閉輸出文件,相當于保存 return 0;}

Go語言文件操作

本文主要介紹了Go語言中文件讀寫的相關操作。

文件是什么?

計算機中的文件是存儲在外部介質(通常是磁盤)上的數據集合,文件分為文本文件和二進制文件。

os.Open() 函數能夠打開一個文件,返回一個 *File 和一個 err 。對得到的文件實例調用 close() 方法能夠關閉文件。

為了防止文件忘記關閉,我們通常使用defer注冊文件關閉語句。

Read方法定義如下:

它接收一個字節切片,返回讀取的字節數和可能的具體錯誤,讀到文件末尾時會返回 0 和 io.EOF 。 舉個例子:

使用for循環讀取文件中的所有數據。

bufio是在file的基礎上封裝了一層API,支持更多的功能。

io/ioutil 包的 ReadFile 方法能夠讀取完整的文件,只需要將文件名作為參數傳入。

os.OpenFile() 函數能夠以指定模式打開文件,從而實現文件寫入相關功能。

其中:

name :要打開的文件名 flag :打開文件的模式。 模式有以下幾種:

perm :文件權限,一個八進制數。r(讀)04,w(寫)02,x(執行)01。

go語言 ioutil.ReadFile 與ioutil.ReadAll差別

?? 當讀取91.2 MB文件時,read1耗時43ms,read2耗時99ms。

查看源碼:

讀取文件主要是通過 Read(p []byte) (n int, err error) :

官方文檔中關于該接口方法的說明:

結論:

??ReadFile(filename string)方法之所以速度快的原因就是先計算出file文件的size,在初始化對應size大小的buff,傳入ReadRead(p []byte) 來讀取字節流

名稱欄目:go語言讀取文件偏移 go 文件讀寫
文章分享:http://m.kartarina.com/article24/hgjjje.html

成都網站建設公司_創新互聯,為您提供面包屑導航ChatGPT品牌網站設計云服務器定制開發網站建設

廣告

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

網站優化排名
主站蜘蛛池模板: 成人年无码AV片在线观看| 亚洲AV永久无码精品| 无码久久精品国产亚洲Av影片| 亚洲AV无码久久精品色欲| 成人免费a级毛片无码网站入口| 日本无码小泬粉嫩精品图| 乱人伦人妻中文字幕无码| 亚洲AV无码码潮喷在线观看| 性色av极品无码专区亚洲| 无码精品视频一区二区三区| 日本爆乳j罩杯无码视频| 日韩aⅴ人妻无码一区二区| 亚洲中文字幕无码中文字| 国产午夜片无码区在线播放| 免费无码又爽又黄又刺激网站| 亚洲av午夜精品无码专区 | 99精品国产在热久久无码| 亚洲AV无码乱码在线观看牲色| 精品欧洲av无码一区二区14| 无码少妇一区二区三区浪潮AV| 国产午夜无码片免费| 一本大道无码人妻精品专区| 久久中文字幕无码一区二区| av无码久久久久不卡免费网站 | 国产精品无码久久av不卡| 精品无码久久久久国产动漫3d| 十八禁无码免费网站| 性无码免费一区二区三区在线| 亚洲精品无码精品mV在线观看| 亚洲精品无码久久不卡| 免费A级毛片无码久久版| 免费无码一区二区| 亚洲AV中文无码乱人伦在线视色 | 日韩人妻无码一区二区三区 | 亚洲中文字幕久久精品无码2021| 亚洲AV综合色区无码一区| 亚洲AV无码专区国产乱码电影| 亚洲人成网亚洲欧洲无码久久| 亚洲AV无码久久精品狠狠爱浪潮| 无码视频在线观看| 无码视频一区二区三区|