1

假设:

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`?
4

2 回答 2

4

不,两者ab的大小完全相同(b不存储指向 的指针func)。

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

在代码中说明这一点:

/////////
// 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;
于 2013-09-17T02:09:15.500 回答
0

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

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

于 2013-09-17T03:24:26.677 回答