由内存池实现总结内存对齐问题

这个问题确实比较基础,些这篇文章为了给自己一个总结,也算是一个笔记记录,争取做到最精简。

结构体对齐关键词:

  “对齐系数”(也叫对齐模数):以通过预编译命令#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 大小相同

原文地址:https://www.cnblogs.com/claresun/p/3813308.html