我想了解用于实现指向非静态成员函数的指针的底层机制。我正在寻找一个类似于vtbl(用于多态的虚拟表)在全局中工作的答案,而不用担心从编译器到编译器的细节可能不同。指向非静态成员函数的指针的值
实施例:
#include <stdio.h>
class A {
public:
int i;
int j;
void foo(void) { };
};
int main()
{
int A::*ptr_j = &A::j;
void (A::*ptr_f)(void) = &A::foo;
printf("Foo::j pointer to data member %p\r\n", ptr_j);
printf("Foo::foo pointer to function member %p\r\n", ptr_f);
}
结果是
Foo::j
指向数据成员0x4
Foo::foo
函数指针构件0x804844c
选自“C++编程语言通过Stroustrup的”,
甲指针构件...更像是一个偏移量的结构或索引到一个数组...
对于数据成员,我知道指针对成员Foo::j
或多或少等于offsetOf(Foo, j)
。在我的主机环境中使用gcc编译器时的值为4,它与offsetOf(Foo, j)
的值为4.
对于函数成员,返回值为0x804844c
。这是一些地址属于全局数据区
所以我的问题是(其中的类加载):
什么是“对象”,也就是地址0x804844c
。
- 它不可能是一个简单的
offsetOf()
,因为这是一个很大的偏移。 - 它不能是vtbl的地址(或vtbl中的条目的地址),因为我相信vbtl是与实例化对象关联的实体,而不是类。
- 它不能是加载函数的实现代码的地址。因为在应用派生对象时,同一个指针可能会呈现多态。
那么什么是在地址0x804844c
对象,什么时候应用操作->*
或.*
其在翻译的指针到成员函数到实际的函数地址的作用是?
在C++语言标准使用该术语的意义上,函数不是“对象”。请注意,成员函数通常作为具有附加参数的常规函数来实现(该对象变成'this')。在那些实现中,它们不驻留在类实例本身中,而是与代码段中的其他(免费)函数一起。 – dyp
*“它不能是加载函数的实现代码的地址,因为当应用派生对象时,同一个指针可能会呈现多态。” [这个答案](http://stackoverflow.com/a/1087671/420683) – dyp