存储成员函数的位置?

时间:2016-09-30 15:12:17

标签: c++

每当为类创建对象时,将为类分配内存空间。所以我的问题是:是否只为成员变量或成员函数创建内存?如果为成员函数创建了内存,那么它们将存储在哪里?

3 个答案:

答案 0 :(得分:1)

传统的可执行文件有三个部分。一个用于初始化数据,一个用于未初始化数据,一个用于代码。这种传统的分区仍在使用中,代码无论来自何处,都放在一个单独的部分中。

当操作系统将可执行文件加载到内存中时,它会将代码放在内存中的一个单独位置,标记为可执行文件(在现代内存保护系统上),并且所有代码都与对象本身分开存储。 / p>

答案 1 :(得分:0)

只有成员变量(加上它们之间和之后的填充)才会对类的sizeof产生影响。

因此,在这种意义上,就对象而言,常规函数不会占用空间。成员函数只是常规静态函数,隐式this指针作为隐藏参数。

尽管如此,虚函数表可能是实现处理多态类型的方式,并且会占用一些空间,但可能只是指向该特定类的所有对象使用的表的指针。 / p>

答案 2 :(得分:0)

成员函数只是位于代码段中的代码。无论你拥有多少物体,它们都只存在一次。 它们与普通函数几乎完全相同,只是它们的第一个参数是this指针,它隐藏在语言中但作为可执行代码的参数出现。

但是有两种成员函数:

  1. "正常"
  2. 虚拟
  3. 在代码大小意义上它们之间没有区别,但它们的调用方式不同。对正常函数的调用可以由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调用正确的函数。