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


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

    结构体对齐关键词:

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

  • 相关阅读:
    【Little Demo】左右按钮tab选项卡双切换
    【Little Demo】从简单的Tab标签到Tab图片切换
    前端工程师说明(仅以自勉)
    CSS 布局整理
    【Javascript Demo】图片瀑布流实现
    【jQuery Demo】图片瀑布流实现
    【CSS Demo】纯 CSS 打造 Flow-Steps 导航
    【CSS Demo】网站页面变灰
    gradlew命令
    Fragment中不能使用自定义带参构造函数
  • 原文地址:https://www.cnblogs.com/claresun/p/3813308.html
Copyright © 2020-2023  润新知