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

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; 
}

慕尼黑的夜晚无繁华
浏览 114回答 2
2回答

莫回无

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

慕运维8079593

该函数是这样的,因为要对内存按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这个地址的前一个地址的内容,将来内存回收或其他计算时有用。
打开App,查看更多内容
随时随地看视频慕课网APP