约的sizeof类成员函数指针的[复制](About sizeof of a class membe

2019-08-31 09:51发布

这个问题已经在这里有一个答案:

  • 成员指针申述 2个回答

比方说,我们有一个A级

class A;

这些类型定义

typedef void (A::*a_func_ptr)(void);
typedef void (*func_ptr)(void);

我的问题是,为什么的sizeof(a_func_ptr)返回16,而的sizeof(func_ptr)返回4(至于在x86系统上的任何指针)?

例如

int main(int argc, char *argv[])
{
  int a = sizeof(a_func_ptr);
  int b = sizeof(func_ptr);
}

Answer 1:

我的问题是,为什么的sizeof(a_func_ptr)返回16,而的sizeof(func_ptr)返回4(至于在x86系统上的任何指针)?

由于指针到成员不同的方式实现。 他们不是在引擎盖下的指针。 一些编译器,如MSVC,实现它们, struct与它不止一个成员。

阅读这篇有趣的文章:

  • 指向成员函数是非常奇怪的动物

注意,在一些编译器,他们可能有相同的尺寸。 底线是:他们是编译器的依赖性。



Answer 2:

考虑以下:

#include <iostream>

class A {
public:
    virtual void foo(){ std::cout << "A::foo" << std::endl; }
    void bar(){ std::cout << "A::bar" << std::endl; }
};

class B : public A {
public:
     void foo(){  std::cout << "B::foo" << std::endl; }
     void bar(){ std::cout << "B::bar" << std::endl; }
};

typedef void (A::*a_func_ptr)(void);

int main() {
   a_func_ptr f = &A::foo;
   a_func_ptr g = &A::bar;
   B b;
   A a;
   (b.*f)();
   (b.*g)();
   (a.*f)();
   (a.*g)();
}

输出:

B::foo
A::bar
A::foo
A::bar

这两个成员指针是同一类型,但都正确地路由在每一个案件的呼叫。

以某种方式,所生成的程序必须知道什么时候一个指针方法实际上是一个简单的方法虚拟的 。 因此,一个方法指针的运行时表示具有以包括更多的信息来处理的第二种情况。

注:大小似乎是执行相关的(我得到8我的系统上)。



Answer 3:

虽然在C和C的函数指针++可被实现为简单的地址,因此,通常的sizeof(FX)==的sizeof(无效*),在C构件指针++常被称为“脂肪指针”的大小,通常两个或三次实现一个简单的函数指针,以应对虚拟继承。

资料来源: 维基百科

这SO答案提供额外的信息 。



Answer 4:

类的指针到成员函数不成立的“确切的地址,”就像一个普通的指针一样。 它存储比普通函数指针的更多信息。

因此,当您使用sizeof测量类的指针到成员函数的大小,你不应该期待,这将是相同的大小作为一个普通函数指针。



Answer 5:

指针成员函数可以是数据结构如在C ++ FAQ指出这里 。 另外指向成员函数是非常奇怪的动物提供了它是如何为Visual C ++实现的例子。



Answer 6:

一个相关的问题是在这里讨论: 值是sizeof(一些指针)总是等于四?

请参阅: 指向成员函数是非常奇怪的动物作进一步的信息。



文章来源: About sizeof of a class member function pointer [duplicate]