9

例として、次のスニペットを取り上げます。

struct Foo
{
  typedef int type;
};

class Bar : private Foo
{
};

class Baz
{
};

ご覧のとおり、この関係には仮想関数は存在しません。これが事実であるため、言語に関する限り、次の仮定は正確ですか?

  • では仮想関数テーブルは作成されませんBar
  • sizeof(Bar) == sizeof(Baz)

基本的に、私はこれを行うことに対して何らかのペナルティを支払うかどうかを理解しようとしています. 私の最初のテスト (単一のコンパイラーではありますが) では、私のアサーションが有効であることが示されていますが、これが私のコンパイラーのオプティマイザーなのか、それとも言語仕様なのかはわかりません。

4

3 に答える 3

10

標準によると、Bar はベースがあるため、POD (plain old data) タイプではありません。その結果、標準では、C++ コンパイラがそのような型をどう処理するかについて、幅広い自由度が与えられます。

ただし、ここで非常識なことを行うコンパイラはほとんどありません。おそらく注意しなければならないことの 1 つは、Empty Base Optimization です。さまざまな技術的な理由から、C++ 標準では、すべてのインスタンスにストレージ スペースを割り当てる必要があります。bar一部のコンパイラでは、Foo にクラス内の専用スペースが割り当てられます。ただし、空のベースの最適化を実装するコンパイラ (ほとんどすべてが最近使用されています) は、空のベースを削除します。

指定されたコンパイラが EBO を実装していない場合、sizeof(foo)少なくとも 2 倍になりsizeof(baz)ます。

于 2010-07-06T23:43:46.430 に答える
1

ええ、仮想メンバーやメンバー変数がなければ、サイズの違いはありません。

于 2010-07-06T23:35:44.303 に答える
0

私の知る限り、最適化が必要な場合、コンパイラはこれを正しく最適化します。

于 2010-07-06T23:43:13.687 に答える