类/结构函数是否存储在对象中?

时间:2013-09-17 02:09:16

标签: c++ class object storage

假设:

struct A {
    int a;
    int b;
};

struct B {
    int a;
    int b;

    int func() {
        return this->a + this->b;
    }
};

B的实例是否包含指向func的指针?

在代码中说明这个问题:

A a; // first 4 bytes are for `int a`, second 4 bytes are for `int b`
B b: // ditto, but is there an extra word for a pointer to function `func`?

2 个答案:

答案 0 :(得分:4)

没有。 ab的大小完全相同(b不存储指向func的内容)。

C ++中的类函数没有与对象本身链接(指向),它们只是作为任何其他函数存储。当你调用一个类函数时,你只是调用一个普通函数(你不是从指针调用它)。这就是为什么像b.func = another_func;这样的东西在C ++中是非法的。

在代码中说明这一点:

/////////
// C++
/////////
struct B {
    int a;
    int b;

    int func() {
        return this->a + this->b;
    }
};

B b;
b.func();


//////////////////////////////
// Example compile output if it was compiled to C (not actual compile output!)
// i.e. this C code will do the equivalent of the C++ code above
//////////////////////////////
struct B {
    int a;
    int b;
};

int B_func(struct B* this) {
    return this->a + this->b;
}

B b;
B_func(&b);

// This should illustrate why it is impossible to do this in C++:
// b.func = another_func;

答案 1 :(得分:0)

C ++函数实际上只是(可能)将对象的隐藏指针作为第一个参数的函数。通过name mangling实现唯一性。

除非该功能是虚拟的;具有一个或多个虚函数的类具有“虚函数表”(vtable),并且这些类的实例具有指向其特定于实例的vtable的指针的开销。 vtable是在对象之前还是之后取决于编译器/实现。