zoukankan      html  css  js  c++  java
  • 成员函数的指针长度

    class A{
    };
    class C : public virtual A{
    public:
     void f1() {}
    };
    猜猜 &C::f1 函数指针的大小是多少?

    int _tmain(int argc,_TCHAR *argv[])

    {

      printf("%d",sizeof(&C::f1));

      return 0;

    }

    显示 12

        --君君

    是要写这么个功能发现的:将所有的函数用个void*存起来,后面再拿出来调用,会出错,发现void*不够存上面那个指针大小

      --滔滔

    原因

    http://bbs.gimoo.net/thread/214108-1.html

    在32位win7操作系统中,一般函数指针的长度为4个字节(32位),而类的成员函数指针的长度随类的定义与否、类的继承种类和关系而变,从无继承关系类(Test3)的4字节(32位)到有虚继承关系类(Virtual Inheritance)(Test4)的12字节(96位),仅有说明(declaration)没有定义的类(Test)因为与其有关的一些信息不明确成员函数指针最长为16字节(128位)。显然, 与一般函数指针不同,指向“类”的成员函数的指针不仅包含成员函数地址的信息,而且包含与类的属性有关的信息,因此,一般函数指针和类的成员函数指针是根本不同的两种类型,当然,也就不能用一般函数指针直接调用类的成员函数

    他要放额外的东西实现虚继承 动态的this

    struct pmf_type1{
    void* vcall_addr; // 成员函数的地址
    };
    struct pmf_type2{
    void* vcall_addr; // 编译器生成的函数的地址
    int delta; // 调整this指针用
    };

  • 相关阅读:
    语句结构1练习
    语句结构(1)
    常用dos命令(4)
    常用dos命令(3)
    常用dos命令(2)
    常用dos命令(1)
    因式分解 · Factor Combinations
    电话号码的字母组合 · Letter Combinations of a Phone Number
    286 walls and gate最近的出口
    286被围绕的区域 · Surrounded Regions
  • 原文地址:https://www.cnblogs.com/minggoddess/p/2251207.html
Copyright © 2011-2022 走看看