1

C++ で Java のインターフェイスを模倣するための小さな実験を行っています。

基本クラス「Base」から継承する「Derived」クラスと、2 つのインターフェイスがあります。継承元のインターフェイスごとに、派生クラスのサイズが大きくなることに気付きました。これは、vptr ごとにより多くのスペースを追加する必要があるためです。これは私には非常に高価に思えるので、主な質問が 2 つあります。

  1. C++ で Java のインターフェイスを模倣するより良い方法はありますか?
  2. Java のオブジェクト サイズは、インターフェイスを実装するたびに大きくなりますか?

私が使用しているコードは次のとおりです。

#include <iostream>

class Base {
public:
    int derp;
    virtual int getHerp() = 0;
    virtual ~Base() { }
};

class Interface1 {
public:
    virtual int getFlippy() = 0;
    virtual ~Interface1() { }
};

class Interface2 {
public:
    virtual int getSpiky() = 0;
    virtual ~Interface2() { }
};

class Derived : public Base, public Interface1, public Interface2 {
public:
    int herp;
    virtual int getHerp() { return herp; }
    virtual int getFlippy() { return 6; }
    virtual int getSpiky() { return 7; }
};

int main() {
    Derived d;
    std::cout << sizeof(d) << std::endl;
    // prints 40. presumably, Derived/Base vptr + derp + Interface1vptr + Interface2 vptr + herp
}
4

3 に答える 3

1

それにかんする

「各 vptr に対して [各オブジェクトに] より多くのスペースを追加する必要があります」

いいえ、その必要はありませ。これはメモリと速度のトレードオフです。もう 1 レベルの間接化を使用すると、各オブジェクト内の 1 つのポインターで十分であり、このクラスのオブジェクトの固定情報を指すことができますが、仮想関数の呼び出しは遅くなる可能性があり、おそらく遅くなります。


それにかんする

「C++ で Java のインターフェイスを模倣するより良い方法はありますか?」

述べたように、 Java のインターフェイスを模倣していないため、これは無意味です。

Java インターフェイスの主な機能は、基本クラスから実装を継承できることです。C++ でこれを行うには、仮想継承を使用できます。したがって:

#include <iostream>

class Base {
public:
    virtual int getHerp() = 0;
    virtual ~Base() { }
};

class Interface1 {
public:
    virtual int getFlippy() = 0;
    virtual ~Interface1() { }
};

class Interface2 {
public:
    virtual int getSpiky() = 0;
    virtual ~Interface2() { }
};

class Flippy_impl
    : public virtual Interface1
{
public:
    virtual int getFlippy() { return 6; }
};

class Derived
    : public Base
    , public virtual Interface1, public virtual Interface2
    , public Flippy_impl
{
public:
    virtual int getHerp() { return 0; }
    virtual int getSpiky() { return 7; }
};

int main() {
    Derived d;
    std::cout << sizeof(d) << std::endl;
    // prints 12. presumably, Derived/Base vptr + Interface1vptr + Interface2 vptr
}

それにかんする

「Java のオブジェクト サイズは、インターフェイスを実装するたびに大きくなりますか?」

いいえ( gaurav5430の回答に基づいて、Java部分のみについて)。

C++ は速度を優先します。Java は別のものを選択します。

注: 上記のコンテキストは、上記のコンテキストです。

于 2013-12-21T09:58:15.633 に答える