昨天面试高通Linux Kernel,面试官考了一个malloc内存对齐的问题,我晚上的时候细细的想了一下,实在是学习的不到位。

有的时候真的应该感谢,像是Qt、Ubuntu Gcc的编译器,他们做的工作很多,malloc直接分配对齐了的内存。如果真的是一个

不是很完善的平台,直接分配给你一个没对齐的内存,当我们传输字节指令的时候分高低八位的时候,定义联合体和结构体这样的偷懒方式

绝对会发一个错误的指令。

oh 要学的太多了。。。。

实际上,对齐参数(MALLOC_ALIGNMENT)大小的设定需要满足以下两点:

  1. 必须是2的幂

  2. 必须是void *的整数倍

所以从request2size可知,在64位系统,如果申请内存为1~24字节,系统内存消耗32字节,当申请25字节的内存时,系统内存消耗48字节。而对于32位系统,申请内存为1~12字节时,系统内存消耗为16字节,当申请内存为13字节时,系统内存消耗为24字节。

#include <stdio.h>

#include <stdlib.h>

#include <stdint.h>

void* aligned_malloc(size_t required_bytes, size_t alignment)

{

    int offset = alignment - 1 + sizeof(void*);

    void* p1 = (void*)malloc(required_bytes + offset);

    if (p1 == NULL)

        return NULL;

    void** p2 = (void**)( ( (size_t)p1 + offset ) & ~(alignment - 1) );

    p2[-1] = p1;

    return p2;

}

void aligned_free(void *p2)

{

    void* p1 = ((void**)p2)[-1];

    free(p1);

}

int main()

{

    void * p[128];

    int i;

    for(i = 0; i < 128; ++i)

    {

        p[i] = aligned_malloc(i, 16);

        printf("%p\n", p[i]);

    }

    for(i = 0; i < 128; ++i)

    {

        aligned_free( p[i] );

    }

    return 0;

}

malloc分配内存进行对齐的操作的更多相关文章

  1. 子函数内malloc分配内存,论如何改变指针参数所指内存,二级指针、三级指针的应用

    工作中优化一段代码,代码中有一大段分配堆内存的内容,我觉得这段代码太长了,更适合放在子函数里面. 我把指针作为参数,然后在子函数中malloc分配内存,结果出现了问题,函数结束后,以参数传进来的指针并 ...

  2. c malloc分配内存

    php中的内存分配有用类似emalloc这样的函数,emalloc实际上是C语言中的malloc的一层封装,php启动后,会向OS申请一块内存,可以理解为内存池,以后的php分配内存都是在这块内存池中 ...

  3. C++ 内存、new与malloc分配内存区别?

    一关于内存 1.内存分配方式 内存分配方式有三种: (1)从静态存储区域分配.内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在.例如全局变量,static变量. (2)在栈上创建. ...

  4. malloc分配内存的结构

    在C/C++,我们都可以使用malloc进行分配大小,单位是字节.   malloc实际分配的内存大小和传入的参数其实是不同的.   实际分配的内存大小>传入的参数大小. malloc分配的内存 ...

  5. 关于被malloc分配内存的指针

    例如创建了一个链表指针p并为其malloc()分配了内存,那么这个指针指向的地方其实是有数据的. 你可以把p->data打印出来,会发现是一个随机值 因为只是分配内存而没有指定data的值,所以 ...

  6. 简单了解malloc分配内存

    直接看代码 #include <stdio.h> #include <malloc.h> int main() { * * ); printf("分配后请查看内存&q ...

  7. malloc的内存分配原理

    0 堆内存的在计算机内存中的形式 根据<The C Programming language>推测得到堆内存,图中的Heap区域即为堆内存块(Heap区域的数目不代表计算机堆内存的真实数目 ...

  8. C语言calloc()函数:分配内存空间并初始化——stm32中的应用

    经常在代码中看到使用malloc来分配,然后memset清零,其实calloc更加方便,一句顶两句~ 头文件:#include <stdlib.h> calloc() 函数用来动态地分配内 ...

  9. malloc分配到一块内存,读写操作时却发生segmentation falt的奇怪问题。

    期初现象:malloc一块内存,读写操作时发生segmentation falt.一般来讲malloc倘若失败应该抛出异常,所以malloc返回一个指针后,这个指针应该都是可用的,况且是进行读操作. ...

随机推荐

  1. PAT Basic 1017 A除以B (20 分)

    本题要求计算 /,其中 A 是不超过 1000 位的正整数,B 是 1 位正整数.你需要输出商数 Q 和余数 R,使得 A=B×Q+R 成立. 输入格式: 输入在一行中依次给出 A 和 B,中间以 1 ...

  2. PAT Basic 1007 素数对猜想 (20 分)

    让我们定义d​n​​为:d​n​​=p​n+1​​−p​n​​,其中p​i​​是第i个素数.显然有d​1​​=1,且对于n>1有d​n​​是偶数.“素数对猜想”认为“存在无穷多对相邻且差为2的素 ...

  3. zencart移站后批量替换数据库中网址、电子邮箱、重置用户密码

    -- SEO标签中网址替换 update categories_description set categories_description=replace(categories_descriptio ...

  4. echarts-all.js:1 Uncaught TypeError: Cannot read property 'getAttribute' of null

    转载:https://blog.csdn.net/you23hai45/article/details/51595108 由于echarts图形ID是由后台传输过来的,并且是根据图形数据一起传过来,出 ...

  5. HDU - 6704 K-th occurrence (后缀数组+主席树/后缀自动机+线段树合并+倍增)

    题意:给你一个长度为n的字符串和m组询问,每组询问给出l,r,k,求s[l,r]的第k次出现的左端点. 解法一: 求出后缀数组,按照排名建主席树,对于每组询问二分或倍增找出主席树上所对应的的左右端点, ...

  6. k8sIngress资源

    k8s提供了两种内建的云端负载均衡机制用于发布公共应用,一种是工作于传输层的service资源,它实现的是TCP负载均衡器,另一种是Ingress资源,它实现的是HTTP(S)负载均衡器. 1)TCP ...

  7. ython CGI编程Ⅱ

    HTTP头部 hello.py文件内容中的" Content-type:text/html"即为HTTP头部的https://www.xuanhe.net/一部分,它会发送给浏览器 ...

  8. Swagger使用--在一个Controller中使用相同(类似)参数的方法

    解决方法:在Startup.cs中加入CustomSchemaIds // Register the Swagger generator, defining 1 or more Swagger doc ...

  9. Flink SQL 如何实现数据流的 Join?

    无论在 OLAP 还是 OLTP 领域,Join 都是业务常会涉及到且优化规则比较复杂的 SQL 语句.对于离线计算而言,经过数据库领域多年的积累,Join 语义以及实现已经十分成熟,然而对于近年来刚 ...

  10. 计算机网络(三),TCP报文段详解

    目录 1.TCP(Transmission Control Protocol传输控制协议)作用 2.TCP报文段详解 三.TCP报文段详解 1.TCP(Transmission Control Pro ...