文档章节

实现支持2^n字节对齐分配的malloc和free函数

borey
 borey
发布于 2014/09/11 00:31
字数 749
阅读 554
收藏 0

代码如下:

#include <stdio.h>
#include <stdlib.h>

void* aligned_malloc(size_t size, size_t alignd_byte)
{
	//offset地址偏移量(byte)
	//alignd_byte对齐字节的预分配空间
	//sizeof(void *)保存真实指针的预分配空间
	size_t offset = sizeof(void *) + alignd_byte - 1;

	//预分配更大的内存块
	//q指向这块内存的首地址
	void* q = malloc(size + offset);
	if (!q)
	    return NULL;
	//printf("q = 0x%p\n", q);

	//对齐后的内存块
	//不管怎样q指针都向后偏移,再& ~(alignd_byte - 1)地址对齐
	//如果是任意字节对齐的话这个偏移计算方法要换
	void* p = (void *)(((size_t)(q)+offset) & ~(alignd_byte - 1));
	//为了配合free函数,保存q指针到p-1的位置
	//p[-1] = q;直接这样做不行void *大小未知无法寻址
	*(((void **)p) - 1) = q;

	//返回对齐后的指针
	return p;
}

void aligned_free(void* p)
{
	//计算原内存块的首地址
	void* q = ((void **)p)[-1];
	free(q);
}

int main()
{
    //对齐内存分配
    int size = 1234; //需要分配的内存大小(byte)
    int alignment = 128; //2^n byte地址对齐
    void* p = NULL;
    void* q = NULL;

    int nCount = 0;//为了测试查找未alignment(byte)对齐的情况
    while (1)
    {
        nCount++;
        void* p = aligned_malloc(size, alignment); //  对齐后的
        void* q = ((void **)p)[-1]; // 未处理过对齐的
        if ((size_t)q % alignment != 0)
        {
            printf("p = %p, %d\n", p, (size_t)p % alignment);
            printf("q = %p, %d\n", q, (size_t)q % alignment);
            for (int i = 1; i <= size / sizeof(int); i++)
            {
                ((int *)p)[i - 1] = i;
            }
            for (int i = 1; i <= size / sizeof(int); i++)
            {
                printf("%d  ", ((int *)p)[i - 1]);
                if (i % 10 == 0)
                    printf("\n");
            }
            printf("\n");
            aligned_free(p);
            break;
        }
        aligned_free(p);
    }
    printf("nCount = %d\n", nCount);

    system("PAUSE");
    return 0;
}

运行结果:

p = 004FE080, 0     //已经对齐了
q = 004FE020, 32    //之前的是32byte,未128byte对齐
1  2  3  4  5  6  7  8  9  10                //测试数据
11  12  13  14  15  16  17  18  19  20
21  22  23  24  25  26  27  28  29  30
31  32  33  34  35  36  37  38  39  40
41  42  43  44  45  46  47  48  49  50
51  52  53  54  55  56  57  58  59  60
61  62  63  64  65  66  67  68  69  70
71  72  73  74  75  76  77  78  79  80
81  82  83  84  85  86  87  88  89  90
91  92  93  94  95  96  97  98  99  100
101  102  103  104  105  106  107  108  109  110
111  112  113  114  115  116  117  118  119  120
121  122  123  124  125  126  127  128  129  130
131  132  133  134  135  136  137  138  139  140
141  142  143  144  145  146  147  148  149  150
151  152  153  154  155  156  157  158  159  160
161  162  163  164  165  166  167  168  169  170
171  172  173  174  175  176  177  178  179  180
181  182  183  184  185  186  187  188  189  190
191  192  193  194  195  196  197  198  199  200
201  202  203  204  205  206  207  208  209  210
211  212  213  214  215  216  217  218  219  220
221  222  223  224  225  226  227  228  229  230
231  232  233  234  235  236  237  238  239  240
241  242  243  244  245  246  247  248  249  250
251  252  253  254  255  256  257  258  259  260
261  262  263  264  265  266  267  268  269  270
271  272  273  274  275  276  277  278  279  280
281  282  283  284  285  286  287  288  289  290
291  292  293  294  295  296  297  298  299  300
301  302  303  304  305  306  307  308
nCount = 1     //第nCount次就出现了malloc未128byte对齐的情况

如果存在问题,欢迎指出~~谢谢

© 著作权归作者所有

共有 人打赏支持
borey
粉丝 28
博文 55
码字总数 31182
作品 0
深圳
程序员
私信 提问
zephyr笔记 2.3.3 堆内存池

1 前言 堆内存池是一个预定义的内存池对象,它允许线程以类似 malloc() 方式从公共内存区域动态分配内存。 我正在学习 Zephyr,一个很可能会用到很多物联网设备上的操作系统,如果你也感兴趣...

iotisan
2018/04/28
0
0
C语言深入学习系列 - 字节对齐&内存管理

用C语言写程序时需要知道是大端模式还是小端模式。 所谓的大端模式,是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中;所谓的小端模式,是指数据的低位保存在内存的...

AlphaJay
2010/04/16
6K
3
[Python源码学习]之内存管理

Python 的内存管理架构(Objects/obmalloc.c): 0. C语言库函数提供的接口 1. PyMem_*家族,是对 C中的 malloc、realloc和free 简单的封装,提供底层的控制接口。 2. PyObject_* 家族,高级...

晨曦之光
2012/05/08
311
0
C中堆管理—浅谈malloc,free,calloc,realloc函数之间的区别

在进行C/C++编程的时候,需要程序员对内存的了解比较好清楚,经常需要操作的内存可分为下面几个类别: 堆栈区(stack):由编译器自动分配与释放,存放函数的参数值,局部变量,临时变量等等...

lichao19881026
2014/05/12
0
0
C中堆管理—浅谈malloc,free,calloc,realloc函数之间的区别

在进行C/C++编程的时候,需要程序员对内存的了解比较好清楚,经常需要操作的内存可分为下面几个类别: 堆栈区(stack):由编译器自动分配与释放,存放函数的参数值,局部变量,临时变量等等...

xiaot99
2014/02/07
0
0

没有更多内容

加载失败,请刷新页面

加载更多

ShxViewer_SHX字体查看

ShxViewe 是一款非常实用的SHX字型浏览软件。从CAD里面的字体浏览软件分离出来,帮助我们预览shx字体。 程序长这个样子: 分别打开txt.shx、hztxt.shx、ltypeshp.shx这几个形文件,可以了解一...

一个小妞
25分钟前
0
0
Jenkins的初步使用

Jenkins真是个宝藏软件,今天大概安装使用了一下,感觉还有好多维度可以探索。 1)安装:在Windows上使用的,在https://jenkins.io/download/下载Windows安装包,解压后是一个msi文件,默认安...

莫在全
37分钟前
1
0
技术复习-分布式事务

一、分布式事务解决方案 1.两阶段提交 two phase commit 角色分为协调者、参与者。协调者负责协调所有的参与者。 第一阶段 prepare 协调者发送prepare请求,参与者锁定资源之后返回ready或者...

Lubby
47分钟前
2
0
jenkins安装

https://my.oschina.net/u/593517/blog/1797968 jenkins 安装 https://my.oschina.net/u/593517/blog/3028175 GIT 安装 https://my.oschina.net/u/593517/blog/3028179 maven 安装 插件安装 ......

Gm_ning
57分钟前
2
0
小言服务端解决方案-监控

框架保证方向,整体包容细节 为保证服务端运行平稳正常,owner应使得系统应保有相应的监控:系统监控,业务监控。而服务运行的平稳高效是否有保障跟监控粒度又成直接的正比关系。本文仅针对开...

重城重楼
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部