【发布时间】:2014-03-14 12:24:44
【问题描述】:
在 Bjarne Stroustrup 的《C++ 编程语言》中,据说可以在不同的地址空间之间传递指向虚拟成员函数的指针。
因为指向虚拟成员的指针是一种偏移量,它不依赖于 对象在内存中的位置。因此,指向虚拟成员的指针可以是 只要使用相同的对象布局,就可以在不同的地址空间之间传递 同时。像指向普通函数的指针,指向非虚函数的指针 不能在地址空间之间交换。
但是,我不明白为什么指向非虚拟函数的指针不能。就像指向虚函数的指针一样,它也像 Bjarne Stroustrup 指出的那样充当索引。
然而,一个指向成员的指针并不是一个指向一块内存的指针。 是指向变量的指针还是指向函数的指针。它更像是一个偏移量 放入结构或索引到数组中,但当然是实现 考虑到数据成员、虚函数之间的差异, 非虚函数等
我当然明白虚函数和非虚函数如vtbl等的区别。但是,在类的每次实例化时,并不像在内存上重新分配相同的成员函数,这意味着我们无法根据对象的内存地址计算成员函数的内存位置。换句话说,非虚函数不依赖于对象在内存中的位置。我认为只有一个接口(=函数)和许多对象(=也许表示)。如果指向非虚函数的指针只是成员函数之间的标识符,那么它不能在进程之间传递和使用是没有意义的。
【问题讨论】:
-
常规方法:
this传入ECX的函数,以固定地址调用。伪代码:func3(&obj); -
虚拟方法:带有
this的函数在ECX中传递,通过vftable 取消引用调用。 vftable 指针是对象的一部分。伪代码:obj->vftable->func3(&obj);而func3基本上只是这里的静态偏移量,而不是全局内存地址。