由記憶體池實現總結記憶體對齊問題

來源:互聯網
上載者:User

標籤:資料   問題   for   linux   amp   size   

這個問題確實比較基礎,些這篇文章為了給自己一個總結,也算是一個筆記記錄,爭取做到最精簡。

結構體對齊關鍵詞:

  “對齊係數”(也叫對齊模數):以通過先行編譯命令#pragma pack(n),n=1,2,4,8,16來改變這一係數

  “對齊規則”:分兩步,資料成員對齊,整體對齊:

        1:資料成員對齊: 按照#pragma pack指定的數值和這個資料成員自身長度中,比較小的那個進行

          公式理解為:min( n , sizeof(curr_mem) )

        2: 整體對齊:按照#pragma pack指定的數值和結構(或聯合)最大資料成員長度中,比較小的那個進行

          公式理解為:min( n , max( sizeof(mem1),sizeof(mem2),sizeof(mem3)......) )

        舉例:

        2位元組對齊(#pragma pack(2))

        結果:sizeof(struct test_t) = 10

        分析過程:

        資料成員對齊: 

        #pragma pack(2)        struct test_t {           int a;  /* 長度4 > 2 按2對齊;起始offset=0;存放位置區間[0,3] */           char b;  /* 長度1 < 2 按1對齊;起始offset=4;存放位置區間[4] */           short c; /* 長度2 = 2 按2對齊;起始offset=6;存放位置區間[6,7] */           char d;  /* 長度1 < 2 按1對齊;起始offset=8;存放位置區間[8] */        };        #pragma pack()

        整體對齊:

        按照 min( 2 , (max(int,short,char) ) 結果做對齊

 

 記憶體池中的起始地址對齊:

   #define NGX_ALIGNMENT   sizeof(unsigned long)    /* platform word */

   #define ngx_align_ptr(p, a) \
      (u_char *) (((uintptr_t) (p) + ((uintptr_t) a - 1)) & ~((uintptr_t) a - 1))

   調用:ngx_align_ptr(ptr,NGX_ALIGNMENT)

   詳細過程不多說,幾個關鍵點:

      1: "字" 在電腦系統中的作用(多讀 深入理解電腦)

      2: 目前Linux平台,指標類型 與 unsigned long 大小相同

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.