每当为类创建对象时,将为类分配内存空间。所以我的问题是:是否只为成员变量或成员函数创建内存?如果为成员函数创建了内存,那么它们将存储在哪里?
答案 0 :(得分:1)
传统的可执行文件有三个部分。一个用于初始化数据,一个用于未初始化数据,一个用于代码。这种传统的分区仍在使用中,代码无论来自何处,都放在一个单独的部分中。
当操作系统将可执行文件加载到内存中时,它会将代码放在内存中的一个单独位置,标记为可执行文件(在现代内存保护系统上),并且所有代码都与对象本身分开存储。 / p>
答案 1 :(得分:0)
只有成员变量(加上它们之间和之后的填充)才会对类的sizeof
产生影响。
因此,在这种意义上,就对象而言,常规函数不会占用空间。成员函数只是常规静态函数,隐式this
指针作为隐藏参数。
尽管如此,虚函数表可能是实现处理多态类型的方式,并且会占用一些空间,但可能只是指向该特定类的所有对象使用的表的指针。 / p>
答案 2 :(得分:0)
成员函数只是位于代码段中的代码。无论你拥有多少物体,它们都只存在一次。 它们与普通函数几乎完全相同,只是它们的第一个参数是this指针,它隐藏在语言中但作为可执行代码的参数出现。
但是有两种成员函数:
在代码大小意义上它们之间没有区别,但它们的调用方式不同。对正常函数的调用可以由compiletime确定,另一个是通过函数指针间接调用 -
如果一个类有一个虚拟成员函数(该类是" polymorph"),编译器需要创建一个" vtable"这个类(不是对象)。
每个对象都包含指向其类的vtable的指针。如果对象是由基类类型的指针访问,则必须访问正确的虚函数。
示例:
class A{
public: bool doSomething();
int i;
};
class B:public A {
public: bool doSomething();
int j;
}
//
B b;
A* a = &b;
a->doSomething(); // <- A::doSomething() is called;
//
这两个类都不需要vtable。
示例2:
class A{
public: virtual bool doSomething();
int i;
};
class B:public A {
public: bool doSomething();
int j;
}
//
B b;
A* a = &b;
a->doSomething(); // <- B::doSomething() is called;
//
A(及其所有孩子)获得vtable。然后创建一个对象,将对象vtable指针设置为正确的表,这样就可以独立于指针的Type调用正确的函数。