• 成员函数的指针长度


    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指针用
    };

  • 相关阅读:
    C#学习记录(一)
    C#学习记录(五)第一次上机实验
    C#学习记录(四)
    C#学习记录(三)
    统计代码行数
    夜深了
    写在岁末的烟花易冷
    c语言|博客作业02
    c语言I博客作业03
    设计模式之模板方法模式
  • 原文地址:https://www.cnblogs.com/minggoddess/p/2251207.html
Copyright © 2020-2023  润新知