假设:
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`?
答案 0 :(得分:4)
没有。 a
和b
的大小完全相同(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是在对象之前还是之后取决于编译器/实现。