gpt4 book ai didi

C++,函数指针和成员函数指针之间的等价性?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:53:07 25 4
gpt4 key购买 nike

我习惯于认为成员函数只是普通函数的特例,其中成员函数在其参数列表的开头有一个额外的参数用于“this”指针,即成员函数应该起作用。我过去以这种方式使用过 boost::function 并且从未遇到过任何问题:

boost::function f<(void)(MyObject*, int, int)> = &MyObject::method_that_takes_two_ints;

但我见过成员函数指针的这种语法:

void (MyObject::*f)( int, int ) = &MyObject::method_that_takes_two_ints;

在此语法中,“this”参数不可见。这让我想知道在引擎盖下指向成员函数的指针是否真的是一个单独的野兽,而这种 boost 正在为我处理细节。

标准对“this”参数的放置有何规定?也许只是在我的编译器上额外的“this”参数排在第一位,也许在其他编译器上它可能在最后?我只是很幸运,我的思维方式与我的编译器(GCC4、VS2005)处理它的方式一致吗?指向成员函数的指针是否始终只是带有额外参数的指向函数指针的特例,还是编译器可以以不同的方式实现它们?

最佳答案

标准几乎没有说明 this 指针应该放在哪里,事实上,对成员函数使用不同的调用约定是相当普遍的。 (所以“this”指针不仅仅是一个额外的第一个参数,它实际上存储在与第一个参数通常不同的位置)

特别是,MSVC 对成员函数使用 thiscall 调用约定,在其他地方使用 stdcallhttp://www.hackcraft.net/cpp/MSCallingConventions/#thiscall描述了它们之间的区别,但是注意thiscallthis指针存储在ECX寄存器中,而stdcall存储堆栈上的所有参数。

您最好将它们视为完全不同的类型。指向成员函数的指针只是指向带有额外参数的函数的指针。

关于C++,函数指针和成员函数指针之间的等价性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/411114/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com