内存对齐

void* AlignedMemory::allocate(size_t size, size_t alignment) 
    { 
        assert(0 < alignment && alignment <= 128 && Bitwise::isPO2(alignment)); 
     unsigned char* p = new unsigned char[size + alignment]; 
        size_t offset = alignment - (size_t(p) & (alignment-1)); 
     unsigned char* result = p + offset; 
         result[-1] = (unsigned char)offset;
     return result; 
    }

该函数是这样的,因为要对内存按2的n次方对齐,在unsigned char* p = new unsigned char[size + alignment]; 
这一句先申请了内存,但所得到的指针p可能不是内存对齐的,如按4字节对齐的话,内存地址只能是0x00000000,0x00000004,0x00000008等,
但如果分配到的p是0x00000001这个地址时怎么办,这时要通过加一个偏移值来使地址对齐,偏移值是这样算的,
size_t offset = alignment - (size_t(p) & (alignment-1));其中( (size_t(p) & (alignment-1))等价于把p的值对alignment求余,
这就是size_t offset = alignment - size_t(p) %(alignment);对0x00000001这个地址来说:offset = 4 - (0x00000001 % 4) = 3; 0x00000001 + 3 = 0x00000004,
这样内存地址就对齐了,至于result[-1] = (unsigned char)offset;
因为1<=OFFSET<=3所以可以空一个字节也就是一个char出来存储result 最后的一行代码将result[-1]存放offset值的作用,是为了在释放时正确算回p的位置.

    void AlignedMemory::deallocate(void* p)
    {
        if (p)
        {
            unsigned char* mem = (unsigned char*)p;
            mem = mem - mem[-1];//算回原分配指针位置
            delete [] mem;
        }
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值