zoukankan      html  css  js  c++  java
  • 编写支持对齐分配的malloc和free函数

       c++在很多地方都采用了对其分配内存的方式,比如一个类对象数据成员的存放就按照对齐方式存放。对齐有利于存取效率的提高:比如有些平台每次读取数据都是从偶数地址开始,若一个int型存放在偶数地址开始处,则一次读周期就可以读出这个整数,而如果存放在奇数地址处,则需要两个读周期。标准库提供的malloc和free并没有对齐的要求,需要的时候,我们可以自己实现一个对齐分配的malloc和free。

      分配内存的时候需要多分配一些空间用以调整指针的开头,使得指针的地址是对齐的。同时注意要在对齐指针的前面“额外”的空间中存放malloc实际分配得到的地址,等下释放内存空间的时候需要用此地址来释放。而且必须同时编写自己的内存释放函数,如果将对齐的地址直接传给标准的free()函数,将出现不确定的行为。

    void* aligned_malloc(size_t required_bytes, size_t alignment){
        void* p1;
        void** p2;
        int offset = alignment - 1 + sizeof(void*);
        if ((p1 = (void*)malloc(required_bytes + offset)) == NULL){
            return NULL;
        }
        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);
    }
  • 相关阅读:
    Web前端一种动态样式语言-- Less
    Windows下查看8080进程及结束进程命令
    Java应用程序实现屏幕的"拍照"
    批处理命令 BAT备份MySQL数据库
    LineNumberReader类
    SAXReader
    linux打包压缩命令汇总
    Jquery获取选中的checkbox的值
    Jquery_联系电话正则表达式
    CSS overflow 属性
  • 原文地址:https://www.cnblogs.com/yplhh/p/4682653.html
Copyright © 2011-2022 走看看