一句看不懂的代码,求解释

目标码神 2011-12-19 01:56:19
//static
inline void*& SimpleSegregatedAllocator::nextOf(void* const pAddr)
{
return *(static_cast<void**>(pAddr));
}

请问这代码是何用意?nextOf函数有什么用处?
nextOf函数这样被调用的
void* SimpleSegregatedAllocator::segregate(void* pChunk, size_t nChunkSize,
size_t uAllocSize, void* pEndNode )
{
char* pOld = static_cast<char*>(pChunk) +
((nChunkSize - uAllocSize)/uAllocSize ) * uAllocSize;
nextOf(pOld) = pEndNode;///pOld point to the end node
//only one partition
if(pOld == pChunk)
{
return pChunk;
}
for(char* pIter = pOld - uAllocSize; pIter != pChunk;
pOld = pIter,pIter -= uAllocSize)
{
nextOf(pIter) = pOld;
}
nextOf(pChunk) = pOld;
return pChunk;
}
...全文
265 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
目标码神 2011-12-20
  • 打赏
  • 举报
回复
不清楚ppv到底在指向谁,也就对ppv的解引用到底是什么也不清楚了。
目标码神 2011-12-20
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 vichal 的回复:]
引用 10 楼 happycodefly 的回复:

因为nextOf(pOld)返回的是引用类型,所以这个函数就是先把pOld转换了一下然后再赋值
[/Quote]
有一个很重要的事情是让我不明白的关键所在,我一直在找static_cast<void**>(pAddr)到底在指着谁,
结果发现void**和void*的关系并不像int**和int*的关系一样,int**指向一个int*类型的指针,int**变量里面保存的是int*变量的地址值,有这么几句代码可以让我们更加清晰:
int* pn=new int(40);//pn指向值为40的一块内存的地址
int** ppn=&pn;//ppn指向pn的地址
void* pv=(void*)pn;//int*指针强制转成void*类型,实际过程是把pn保存的地址值赋给pv
void* pv2=(void*)ppn;//这句也是可以的,实际过程是把ppn保存的地址,也就是pn的地址赋给pv2
void** ppv2=&pv;//指向void*类型的指针的指针
void** ppv=static_cast<void**>(pv);//而int** ppn=static_cast<int**>(pn)是不允许的
//最后这句是最难理解的,我找不到ppv到底在指向谁,所以我的脑袋就短路了
目标码神 2011-12-20
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 vichal 的回复:]

因为nextOf(pOld)返回的是引用类型,所以这个函数就是先把pOld转换了一下然后再赋值
[/Quote]
谢谢大家,我觉得应该是这样的,最后返回的并非pOld它自己,而是pOld的解引用,只不过返回的解引用变成了void*类型的
nextOf(pOld)=pEndNode;这一句并非是给pOld赋值,因为我跟踪发现pEndNode=NULL,nextOf(pOld)=NULL执行完后,pOld的值并没有变,但是pOld指向的内容变为0了。
vichal 2011-12-19
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 happycodefly 的回复:]

引用 8 楼 qscool1987 的回复:


谢谢qscool1987的解释,nextOf(pOld) = pEndNode;这一句也是高手写出来的啊,完全不知道做了什么。
[/Quote]

因为nextOf(pOld)返回的是引用类型,所以这个函数就是先把pOld转换了一下然后再赋值
目标码神 2011-12-19
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 qscool1987 的回复:]

[/Quote]
谢谢qscool1987的解释,nextOf(pOld) = pEndNode;这一句也是高手写出来的啊,完全不知道做了什么。
目标码神 2011-12-19
  • 打赏
  • 举报
回复
inline void*& SimpleSegregatedAllocator::nextOf(void* const pAddr)
{
return pAddr;
}
那直接写成这样不就行了吗?
qscool1987 2011-12-19
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 happycodefly 的回复:]
是不是这个函数的作用就是:把传过来的指针转换成void*,然后再把它自身返回?
[/Quote]
目标码神 2011-12-19
  • 打赏
  • 举报
回复
是不是这个函数的作用就是:把传过来的指针转换成void*,然后再把它自身返回?
目标码神 2011-12-19
  • 打赏
  • 举报
回复
还是不懂,能说的再详细点吗?
void SimpleSegregatedAllocator::allocateChunk()
{
FX_DEBUG("Segregated allocator malloc [%u] bytes.", m_uChunkSize);

void* pChunk = ::malloc(m_uChunkSize);
FIRTEX_ASSERT2(pChunk);

m_pChunk = pChunk;
m_pFirst = segregate(pChunk, m_uChunkSize, m_uAllocSize, m_pFirst);
}
qscool1987 2011-12-19
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 happycodefly 的回复:]
然后return呢?void*&? 还有 *(),外面那个*
[/Quote]
好好给你解释下吧:
inline void*& SimpleSegregatedAllocator::nextOf(void* const pAddr)
先看参数void* const pAddr,这说明什么和类型的实参都可以,因为任何类型的实参都可以隐士转换为void*类型
再看函数体:return *(static_cast<void**>(pAddr));
先把pAddr一级指针强转为2级指针,为什么要这么做?主要是void类型不能解引用,但是void**可以解引用
这句就是先专为void**然后接一次引用
最后看返回类型:void*& 是一个指针引用类型,返回的是一个指针的引用
目标码神 2011-12-19
  • 打赏
  • 举报
回复
然后return呢?void*&? 还有 *(),外面那个*
w378567402 2011-12-19
  • 打赏
  • 举报
回复
应该是将pAddr转换成一个指向指针的指针
qscool1987 2011-12-19
  • 打赏
  • 举报
回复
inline void*& SimpleSegregatedAllocator::nextOf(void* const pAddr)
{
return *(static_cast<void**>(pAddr));
}
其实很简单,这只是一个将指针类型强制转换为void*类型而已,通过static_cast的手法来进行强转

64,439

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧