内存对齐

来源:互联网 发布:淘宝买家总是退货 编辑:程序博客网 时间:2024/04/30 00:37
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;        }    }

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 电话手表二维码丢了怎么办 360儿童手表二维码丢了怎么办 喜书郎电话手表二维码丢了怎么办 微信充话费充错号码怎么办 话费冲到了副卡怎么办 冲话费冲错了怎么办 微信支付未到账怎么办 速卖通修补配件到国外怎么办 速卖通流量低怎么办 速卖通被判定重复铺货怎么办 拼多多商品降权怎么办 运满满有了差评怎么办 房贷款还清后该怎么办 身份证被偷了怎么办啊 苹果手机wifi速度慢怎么办 电脑桌面上的图标不见了怎么办 夏天手机没地方放怎么办 上班手机没地方放怎么办 京东退款未到账怎么办 京东退款失败后怎么办 在京东申请退款怎么办 微信退款没收到钱怎么办 在拼多多不发货怎么办 扫二维码群发微信骗局怎么办 电脑高清晰音频管理器打不开怎么办 吃鸡耳机有杂音怎么办 分期付款车被朋友卖了怎么办 网上购物付款显示繁忙怎么办 同行招牌高于我的招牌怎么办 拼多多刷手退款怎么办 网银卡在手机上卸载了怎么办 企业网银密码忘了怎么办 网银钱转错了怎么办 民生百货购物卡过期了怎么办 新办卡注册过支付宝账号怎么办 床上用品专卖店没人进店怎么办 红蚂蚁咬了红肿痒怎么办 碎纸机轮不转了怎么办 轮滑鞋刀架螺丝圆了了怎么办 万朋商城2018年怎么办 超市盘点少了烟怎么办