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);
    }
  • 相关阅读:
    利用 runtime,解决多次点击相同 button,导致重复跳转的问题-b
    dbcp数据库连接池管理
    dbutil组件的常见用法
    事务的概念及常用方法
    jdbc链接基础
    MySQL数据约束和关联查询
    mysql基本操作语句
    jsp常用标签和标签库及javaBean规范
    EL表达式
    会话过程保存数据对象cookie和session
  • 原文地址:https://www.cnblogs.com/yplhh/p/4682653.html
Copyright © 2011-2022 走看看