实现支持2^n字节对齐分配的malloc和free函数
来源:互联网 发布:个人如何开通淘宝直播 编辑:程序博客网 时间:2024/05/17 18:19
#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;}
0 0
- 实现支持2^n字节对齐分配的malloc和free函数
- 编写支持对齐分配的malloc和free函数
- 编写支持对其分配的malloc和free函数,分配内存时,malloc函数返回的地址必须能被2的n次方整除
- 字节对齐重写malloc 和 free
- malloc和free的实现
- 实现任意字节对齐的内存分配和释放
- 实现任意字节对齐的内存分配和释放
- 程序员面试金典: 9.13 C和C++ 13.9编写对齐的malloc和free函数。
- 任意字节对齐的内存分配函数
- 内存分配,malloc()和free()
- malloc内存分配字节对齐问题
- 简单的malloc,free实现函数
- malloc与free函数的实现代码
- 调用malloc()函数之后,内核发生了什么?附malloc()和free()实现的源代码
- 基于N字节对齐的内存分配与归还
- 动态内存分配及Malloc/free的实现
- 浅析动态内存分配及Malloc/free的实现
- 浅析动态内存分配及Malloc/free的实现
- 虚析构函数(√)、纯虚析构函数(√)、虚构造函数(X)
- XHttp--轻量级网络框架
- 使用CocosStudio导出的资源
- 《计算机网络》知识总结-5.TCP的研究学习思路
- 样本均值的特征与分布
- 实现支持2^n字节对齐分配的malloc和free函数
- nexus私服学习总结
- RequireJS:一款优秀的AMD模块加载器
- 68. Text Justification
- 利用SVN实现增量打包
- Java Web错误页面
- 树状数组入门之POJ 2352 Star
- 欢迎使用CSDN-markdown编辑器
- eclipse F3可以看到class的定义,但是编辑器里有叉叉,refers to type "", 类型不匹配