成员函数16字节的使用

原创 2016年05月31日 13:19:54

namespace pointer_to_member_func
{
struct A
{
void foo() const {
std::cout << “A’s this:\t” << this << std::endl;
}
char pad0[32];
};

    struct B 
    {
        void bar() const {
            std::cout << "B's this:\t" << this << std::endl;
        }
        char pad2[64];
    };

    struct C : A, B
    { };

    void call_by_ptr(const C &obj, void (C::*mem_func)() const)
    {
        void *data[2];
        std::memcpy(data, &mem_func, sizeof(mem_func));
        std::cout << "------------------------------\n"
            "Object ptr:\t" << &obj <<
            "\nFunction ptr:\t" << data[0] <<
            "\nPointer adj:\t" << data[1] << std::endl;
        (obj.*mem_func)();
    }
    void test()
    {
        C obj;
        call_by_ptr(obj, &C::foo);
        call_by_ptr(obj, &C::bar);
    }
}
namespace pointer_to_virtual_member_func
{
    struct A 
    {
        virtual void foo() const {
            std::cout << "A's this:\t" << this << std::endl;
        }
        char pad0[32];
    };

    struct B 
    {
        virtual void bar() const {
            std::cout << "B's this:\t" << this << std::endl;
        }
        char pad2[64];
    };

    struct C : A, B
    { };

    void call_by_ptr(const C &obj, void (C::*mem_func)() const)
    {
        void *data[2];
        std::memcpy(data, &mem_func, sizeof(mem_func));
        std::cout << "------------------------------\n"
            "Object ptr:\t" << &obj <<
            "\nFunction ptr:\t" << data[0] <<
            "\nPointer adj:\t" << data[1] << std::endl;
        (obj.*mem_func)();
    }
    void test()
    {
        C obj;
        call_by_ptr(obj, &C::foo);
        call_by_ptr(obj, &C::bar);
    }
}
输出结果如下:

Object ptr: 0x7fffb54de600
Function ptr: 0x466606
Pointer adj: 0

A’s this: 0x7fffb54de600

Object ptr: 0x7fffb54de600
Function ptr: 0x466648
Pointer adj: 0x20

B’s this: 0x7fffb54de620

Object ptr: 0x7fffb54de5e0
Function ptr: 0x1
Pointer adj: 0

A’s this: 0x7fffb54de5e0

Object ptr: 0x7fffb54de5e0
Function ptr: 0x1
Pointer adj: 0x28
B’s this: 0x7fffb54de608

对应虚函数的16字节,前8个字节为其函数在虚函数表中的偏移量,后一个8字节是this指针相对于对象地址的偏移量,而此8字节,如果用sizeof计算的话是不包括在内的,上面的类是96B,下面是112B

为什么 C++ 中成员函数指针是 16 字节?

当我们讨论指针时,通常假设它是一种可以用 void * 指针来表示的东西,在 x86_64 平台下是 8 个字节大小。例如,下面是来自 维基百科中关于 x86_64 的文章 的摘录: Pus...
  • hazir
  • hazir
  • 2014年12月09日 22:37
  • 1103

C++友元成员函数使用实例

  • 2013年05月25日 12:35
  • 2KB
  • 下载

关键字:sizeof,字节对齐,多继承,虚拟继承,成员函数指针

sizeof,一个其貌不扬的家伙,引无数菜鸟竟折腰,小虾我当初也没少犯迷糊,秉着“辛苦我一个,幸福千万人”的伟大思想,我决定将其尽可能详细的总结一下。但当我总结的时候才发现,这个问题既可以简单,又可以...

C++学习笔记16——成员函数

1,简介 类的成员函数主要分为两种: a.普通的成员函数 b.构造函数 成员函数的函数原型必须在类中定义,但是函数体既可以在类中定义,也可以在类外定义。 在类中定义的成员函数被编译器当作内联...

Item 16: 让const成员函数做到线程安全

本文翻译自《effective modern C++》,由于水平有限,故无法保证翻译完全正确,欢迎指出错误。谢谢! 如果我们在数学领域里工作,我们可能会发现用一个类来表示多项式会很方便。在这个类中,如...
  • boydfd
  • boydfd
  • 2016年02月05日 10:52
  • 443

韩顺平 javascript教学视频_学习笔记16_Object类_闭包_成员函数再说明_聪明的猪小练习

js面向(基于)对象编程—类(原型对象)与对象 对象—Object类 Object类是所有javascript类的基类,提供了一种创建自定义对象的简单方式,不需要程序员再定义构...

C++必知必会之(16)指向成员函数的指针并非指针

1、获取非静态成员函数的地址时,得到的不是一个地址,而是一个指向成员函数的指针。 class Shape  {     public:         //.....         void mov...

mfc常用类及其成员函数

  • 2011年12月15日 17:09
  • 38KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:成员函数16字节的使用
举报原因:
原因补充:

(最多只允许输入30个字)