不同地址空间之间成员函数指针的可交换性 在Bjarne Stroustrup的C++编程语言中,可以说,虚拟成员函数的指针可以在不同的地址空间之间传递。

不同地址空间之间成员函数指针的可交换性 在Bjarne Stroustrup的C++编程语言中,可以说,虚拟成员函数的指针可以在不同的地址空间之间传递。,c++,pointers,C++,Pointers,因为指向虚拟成员的指针是一种偏移量,所以它不依赖于 对象在内存中的位置。因此,可以创建指向虚拟成员的指针 只要使用相同的对象布局,就可以在不同的地址空间之间传递 两者都有。与指向普通函数的指针一样,指向非虚函数的指针 无法在地址空间之间交换 然而,我不明白为什么指向非虚函数的指针不能。就像指向虚函数的指针一样,它也像Bjarne Stroustrup指出的索引一样 然而,指向成员的指针不是指向内存块的指针 指向变量的指针或指向函数的指针无效。它更像是一个偏移量 结构或数组的索引,当然是实现 考虑

因为指向虚拟成员的指针是一种偏移量,所以它不依赖于 对象在内存中的位置。因此,可以创建指向虚拟成员的指针 只要使用相同的对象布局,就可以在不同的地址空间之间传递 两者都有。与指向普通函数的指针一样,指向非虚函数的指针 无法在地址空间之间交换

然而,我不明白为什么指向非虚函数的指针不能。就像指向虚函数的指针一样,它也像Bjarne Stroustrup指出的索引一样

然而,指向成员的指针不是指向内存块的指针 指向变量的指针或指向函数的指针无效。它更像是一个偏移量 结构或数组的索引,当然是实现 考虑到数据成员、虚拟函数、, 非虚拟函数等


一、 当然,要理解虚拟函数和非虚拟函数(如vtbl等)之间的区别。然而,在类的每个实例化上,并不像相同的成员函数在内存中被再次分配,这意味着我们不能根据对象的内存地址计算成员函数的内存位置。换句话说,非虚函数不依赖于对象在内存中的位置。我认为只有一个接口(=函数)和许多对象(=可能表示)。如果指向非虚函数的指针就像成员函数之间的标识符一样,那么它就没有意义,不能在进程之间传递和使用。

调用非虚函数就像调用非成员函数一样,只是使用一个额外的隐藏
参数。指向1的指针将包含要调用的函数的地址-任何额外的间接级别都是不必要的,并且会减慢函数调用并使程序膨胀


通过在与对象关联的表中查找地址来调用虚拟函数,该对象的内容取决于动态类型。指向一个表的指针将包含该表的索引。它不能存储任何特定函数的地址:它可能引用基类成员,基类成员被不同的派生类以不同的方式重写,因此正确的重写只能通过虚拟查找来知道。

非虚拟函数的调用与非成员函数类似,只需使用一个额外的隐藏
参数即可。指向1的指针将包含要调用的函数的地址-任何额外的间接级别都是不必要的,并且会减慢函数调用并使程序膨胀


通过在与对象关联的表中查找地址来调用虚拟函数,该对象的内容取决于动态类型。指向一个表的指针将包含该表的索引。它不能存储任何特定函数的地址:它可能引用基类成员,基类成员由不同的派生类进行不同的重写,因此正确的重写只能通过虚拟查找来知道。

像Bjarne一样思考。暗示一下,他喜欢表演。他想要尽可能快的速度


如果您有一个非虚拟方法,您希望立即调用该方法。任何间接的做法都会使事情变慢。虚拟方法具有一些内置的间接性。它需要查找它使用的特定类型的对象:<代码> < <代码>和偏移,如果不需要,则C++将绕过。在非虚拟函数中,这是不必要的,为提高性能而跳过

像比亚恩那样思考。暗示一下,他喜欢表演。他想要尽可能快的速度

如果您有一个非虚拟方法,您希望立即调用该方法。任何间接的做法都会使事情变慢。虚拟方法具有一些内置的间接性。它需要查找它使用的特定类型的对象:<代码> < <代码>和偏移,如果不需要,则C++将绕过。在非虚拟函数中,这是不必要的,为提高性能而跳过

就像指向虚函数的指针一样,它也像Bjarne Stroustrup指出的索引一样

是的,但是与什么相关的索引?指向非虚函数的指针是进程地址空间的索引。函数可以在不同的进程中位于不同的地址,因此具有不同的索引。在一个进程中指向给定函数的指针(只是一个内存地址)可以指向另一个进程中完全不同的东西

指向虚拟函数的指针是相对于对象地址的偏移量,因此给定一个对象(在任何进程自己的地址空间中),您可以通过应用偏移量来获取vtbl条目来找到虚拟函数。对象在不同的进程中位于不同的地址(或者一个进程中不同实例的不同地址),但到vtbl的偏移量是固定的

换句话说,非虚函数不依赖于对象在内存中的位置

没错,这就是问题所在!它们取决于函数在内存中的位置,这在进程之间不是常数

我认为只有一个接口(=函数)和许多对象(=可能表示)

如果指向非虚函数的指针就像成员函数之间的标识符一样,那么它就没有意义,不能在进程之间传递和使用它

但它们的行为“不像一个标识符”。。。它们是指针。它们是内存中的地址。如果函数在一个进程中位于地址0x12341234,在另一个进程中位于地址0x00011234,则不能在进程之间传递指针,它将不会指向同一个对象

就像指向虚函数的指针一样,它也像Bjarne Stroustrup指出的索引一样。