<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                [TOC] # 內存對齊的作用 1. 平臺原因(移植):不是所有的硬件平臺都可以訪問任意位置上的任意數據的,有些硬件只能在特定位置取特定數據。 2. 性能問題:經過內存對齊,CPU的內存訪問速度會提升。因為對齊的元素只需要一次內存訪問,未對齊的需要兩次。 # 性能問題 一般程序員會認為內存如下圖所示,是有一個個的字節組成,而CPU卻不是這樣看待的。 ![](https://box.kancloud.cn/7e7db871a9c1baa992a09ce19acb72be_340x44.png) CPU把內存當作一塊一塊的,塊的大小可以是2、4、8、16字節大小,因此CPU讀取內存是一塊一塊讀取的。(塊的大小稱為*內存讀取粒度*) ![](https://box.kancloud.cn/11f418021143475bcacaefea0d75aac4_281x43.png) 假設CPU要讀取一個int型4字節大小的數據,分兩種情況討論: 1. 數據從0字節開始 2. 數據從1字節開始 假設內存讀取粒度為4: ![](https://box.kancloud.cn/d64a62c29471cd0613d351c6df0ac311_369x122.png) 當數據從0字節開始時,CPU只需要讀取一次內存即可取到數據。 當數據從1字節開始時,CPU讀取數據就變得復雜了,因為數據沒有在一個塊內存儲。這種情況下,CPU先訪問內存讀取0-3字節數據,在訪問內存讀取4-7字節數據,然后把0、5、6、7字節的數據去掉,合并1、2、3、4字節數據。這樣的操作顯然是浪費了很多性能,所以就有了字節對齊,以空間換時間。 ![](https://box.kancloud.cn/da7b1fb3bb43311fd6e274b995705ff1_372x194.png) # 內存對齊規則 默認對齊長度:編譯器會有一個默認對齊長度,golang 中 64 為系統默認的對齊長度是 8 (這個默認值規則具體不清楚,后面再來補充) 1. 對于結構的各個成員,第一個成員位于偏移為0的位置,以后每個數據成員的起始位置必須是默認對齊長度和該數據成員長度中最小的長度的倍數。 2. 除了結構成員需要對齊,結構本身也需要對齊,結構的長度必須是編譯器默認的對齊長度和成員中最長類型中最小的數據大小的倍數對齊。 # GO類型對齊 ~~~ package main import ( "fmt" "reflect" ) type Data struct { b byte a int32 x int64 } type Data1 struct { b byte x int64 a int32 } func main() { var d Data t := reflect.TypeOf(d) fmt.Println(t.Size(),t.Align()) var d1 Data t1 := reflect.TypeOf(d1) fmt.Println(t1.Size(),t1.Align()) } ---------- 輸出結果: 16 8 24 8 ~~~ 上面的內存結構如下所示: d 的內存結構: ~~~ b---|aaaa|xxxx|xxxx d1的內存結構: b---|----|xxxx|xxxx|aaaa|---- ~~~ C 語言對齊規則和 golang 一致,C 語言的默認對齊大小由編譯器決定,我們也可以通過以下代碼修改默認對齊大小。 ~~~ pragma pack(2) // 修改默認對齊大小為 2 ~~~
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看