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

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

结构体对齐关键词:

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

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

时间: 2024-11-08 00:35:25

由内存池实现总结内存对齐问题的相关文章

nginx 学习四 内存池 ngx_pool_t 和内存管理操作

这几天在看nginx,发现凡是有内存申请的地方都有pool这个东东出现,仔细看看,原来pool的类型是ngx_pool_t,是nginx用来做内存管理的,于是就决定看看他的实现. 1 nginx内存池相关的结构体 ngx_pool_t定义在core/ngx_palloc.h ngx_palloc.c中,下面是几个主要的结构体 ngx_pool_data_t typedef struct { //内存池的数据结构模块 u_char *last; //当前内存分配结束位置,即下一段可分配内存的起始位

内存池--定长内存池

简介 STL的 __pool_alloc, __mt_alloc,boost的pool系列, ace的ACE_Cached_Allocator均为定长内存池. 说明 内存池,根据存储的元素的长度是否可变,分为变长,与定长两种内存池. 从逻辑上来讲,定长内存池只需存储相同大小的元素,因此无须花费额外的空间(数据结构)来存储元素长度的信息. 以上几种定长内存池都可以较好的处理定长内存频繁分配的问题. STL--pool_alloc pool_alloc,原理是挂了16个链表(_S_free_list

内存池技术介绍(图文并茂,非常清楚)

看到一篇关于内存池技术的介绍文章,受益匪浅,转贴至此. 原贴地址:http://www.ibm.com/developerworks/cn/linux/l-cn-ppp/index6.html 6.1 自定义内存池性能优化的原理 如前所述,读者已经了解到"堆"和"栈"的区别.而在编程实践中,不可避免地要大量用到堆上的内存.例如在程序中维护一个链表的数据结构时,每次新增或者删除一个链表的节点,都需要从内存堆上分配或者释放一定的内存:在维护一个动态数组时,如果动态数组的

【核心基础】内存池

本节将研究Nginx关于内存申请与释放的核心代码: 基本示意图 内存池对象初始状态 小内存申请后状态 大内存申请后状态 核心代码分析 核心结构体声明 //大内存管理结构 struct ngx_pool_large_s { ngx_pool_large_t *next; //连接下一个大内存管理 void *alloc; //申请的大内存地址 }; //内存池中数据管理 typedef struct { u_char *last; //可用内存的起始地址 u_char *end; //可用内存的末

高性能之内存池

内存池(Memory Pool)是一种内存分配方式. 通常我们习惯直接使用new.malloc等API申请分配内存,这样做的缺点在于:由于所申请内存块的大小不定,当频繁使用时会造成大量的内存碎片并进而降低性能.内存池则是在真正使用内存之前,先申请分配一定数量的.大小相等(一般情况下)的内存块留作备用.当有新的内存需求时,就从内存池中分出一部分内存块,若内存块不够再继续申请新的内存.这样做的一个显著优点是尽量避免了内存碎片,使得内存分配效率得到提升. (1)针对特殊情况,例如需要频繁分配释放固定大

Nginx 内存池管理

概述 Nginx 使用内存池对内存进行管理,内存管理的实现类似于前面文章介绍的<STL源码剖析--空间配置器>,把内存分配归结为大内存分配 和 小内存分配.若申请的内存大小比同页的内存池最大值 max 还大,则是大内存分配,否则为小内存分配. 大块内存的分配请求不会直接在内存池上分配内存来满足请求,而是直接向系统申请一块内存(就像直接使用 malloc 分配内存一样),然后将这块内存挂到内存池头部的 large 字段下. 小块内存分配,则是从已有的内存池数据区中分配出一部分内存. Nginx

菜鸟nginx源码剖析数据结构篇(九) 内存池ngx_pool_t[转]

菜鸟nginx源码剖析数据结构篇(九) 内存池ngx_pool_t Author:Echo Chen(陈斌) Email:[email protected] Blog:Blog.csdn.net/chen19870707 Date:Nov 11th, 2014 今天是一年一度的光棍节,还没有女朋友的程序猿童鞋不妨new一个出来,内存管理一直是C/C++中最棘手的部分,远不止new/delete.malloc/free这么简单.随着代码量的递增,程序结构复杂度的提高.今天我们就一起研究一下以精巧著

nginx源码分析—内存池结构ngx_pool_t及内存管理

Content 0. 序 1. 内存池结构 1.1 ngx_pool_t结构 1.2 其他相关结构 1.3 ngx_pool_t的逻辑结构 2. 内存池操作 2.1 创建内存池 2.2 销毁内存池 2.3 重置内存池 2.4 分配内存 2.4.1 ngx_palloc()函数分析 2.4.2 ngx_palloc_block()函数分析 2.5 释放内存 2.6 注册cleanup 2.7 内存池的物理结构 3. 一个例子 3.1 代码 3.2 如何编译 3.3 运行结果 4. 小结 5. 致谢

菜鸟nginx源码剖析数据结构篇(九) 内存池ngx_pool_t

1.源代码位置 头文件:http://trac.nginx.org/nginx/browser/nginx/src/core/ngx_palloc.h 源文件:http://trac.nginx.org/nginx/browser/nginx/src/core/ngx_palloc.c 2.数据结构定义 先来学习一下nginx内存池的几个主要数据结构:     ngx_pool_data_t(内存池数据块结构) 1: typedef struct { 2:     u_char