zoukankan      html  css  js  c++  java
  • 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
    ", p[i]);
    
        }
    
        for(i = 0; i < 128; ++i)
    
        {
    
            aligned_free( p[i] );
    
        }
    
        return 0;
    
    }
    
    
  • 相关阅读:
    AC自动机(转载)
    hdu 4352 XHXJ's LIS(数位dp+状压)
    hdu 4734 F(x)(数位dp)
    hdu 3709 Balanced Number(数位dp)
    hdu 6268 Master of Subgraph(点分治+bitset)
    poj 1741 tree(点分治)
    pytorch 矩阵数据增加维度unsqueeze和降低维度squeeze
    pytorch seq2seq模型中加入teacher_forcing机制
    pytorch seq2seq模型训练测试
    python os模块判断文件是否存在,file_path获取当前文件路径
  • 原文地址:https://www.cnblogs.com/sigma0/p/10837760.html
Copyright © 2011-2022 走看看