为什么函数中的指针值与作为参数传入的指针值不同?

Bee*_*and 2 c++ pass-by-value

我有以下构造函数:

MutexWrapper::MutexWrapper(Mutex * pMutex)
{
  DebugPrint("0x%x", pMutex); // displays 0x1f83e54
}
Run Code Online (Sandbox Code Playgroud)

并在以下函数中调用它:

void OnReviewBuffer_Callback( void * pUserData )
{
  ReviewBuffer * thePointer = (ReviewBuffer *) pUserData;

  DebugPrint("0x%x", thePointer); // this displays 0x1f83e48

  MutexWrapper theMutexWrapper(thePointer);
}
Run Code Online (Sandbox Code Playgroud)

不幸的是我无法提供整个定义ReviewBuffer- 但我希望以下内容足够:

class ReviewBuffer  : public StreamConsumer_Base, public Mutex
{
  ...
};
Run Code Online (Sandbox Code Playgroud)

问题是,当我打印出来时,thePointer我得到了0x1f83e48,但是从构造函数内部打印的值是0x1f83e54.

为什么指针值不同 - 这是否与传递指针副本的值传递有关?

sya*_*yam 5

您的类ReviewBuffer使用多重继承:

class ReviewBuffer  : public StreamConsumer_Base, public Mutex
{
  ...
};
Run Code Online (Sandbox Code Playgroud)

类的内部布局(可能是*)如下所示:

Offset 0    class StreamConsumer_Base
            ... contents of that class (12 bytes including alignment: 0x1f83e54 - 0x1f83e48)
Offset 12   class Mutex
            ... contents of that class (unknown size)
Run Code Online (Sandbox Code Playgroud)

(*)可能因为标准中没有任何规定要求.这只是编译器实现它的通常方式.

最初打印时thePointer,它指向ReviewBuffer对象即.偏移0的类.但是当你将它传递给你的函数时,编译器会自动调整指针以指向Mutex部分ReviewBuffer.由于该Mutex部分位于偏移量12处,因此指针的值不能相同(想一想:如果它相同,则不会指向Mutexa ReviewBuffer或a或a StreamConsumer_Base).