为了账号安全,请及时绑定邮箱和手机立即绑定

关于在ogre中内存分配函数源码中的几个疑问,请求各路高手解答。

关于在ogre中内存分配函数源码中的几个疑问,请求各路高手解答。

C PHP
慕尼黑的夜晚无繁华 2023-01-06 22:18:32

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 回答

?
莫回无

TA贡献1622条经验 获得超7个赞

SDK版本只提供了接口供你使用,这时候OGRE只是一个规则已经确定好了的开发工具,你只能使用他既定的规则和接口,学习ogre使用的话从SDK入手就行。源码版本允许你对接口的内容进行修改。

查看完整回答
反对 回复 2023-01-10
?
慕运维8079593

TA贡献1638条经验 获得超5个赞

该函数是这样的,因为要对内存按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;这个的意思我也不太清楚,估计与具体的内存管理策略有关,用来标记result这个地址的前一个地址的内容,将来内存回收或其他计算时有用。

查看完整回答
反对 回复 2023-01-10

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信