malloc分配內存進行對齊的操作


昨天面試高通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;

}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM