3
#include <iostream>
using namespace std;

class Test {
    int a;
public:
    int getA() {
        return a;
    }

Test(): a(1){}
Test(int i): a(i){}

};



int main() {
    Test t1(100);
    cout << sizeof(t1) << " " << sizeof(1) << endl; // 4 4
    return 0;
}

C++ のクラスにはオーバーヘッドがまったくないようです。t1 は整数のようにサイズ 4 です。別の int メンバーを Test に追加すると、サイズが 8 に増加します。

4より大きいものを期待していたでしょう

クラスにオーバーヘッドがないというのは本当ですか?

4

4 に答える 4

5

C++ のクラスにはオーバーヘッドがまったくないようです。

クラスに仮想関数がない限り、そうです。どのようなオーバーヘッドが予想されますか? 仮想レス クラスは、型に関連付けられた一連の関数を含む変数の単なるコレクションです。

class Foo {
    int a;
    int bar() const { return a*a; }
};

で簡単に置き換えることができます

struct Foo {
    int a;
}

int Foo_bar(Foo const *that) {
    return (that->a) * (that->a);
}

これらの各スニペットをコンパイルすると、アセンブリ コードがほとんど同じに見えることがわかります。


しかし、仮想関数を 1 つ追加すると、ゲームは劇的に変化します。

于 2012-11-05T11:21:04.267 に答える
4

virtualメソッドまたはvirtual継承を使用する場合、オーバーヘッドが発生します。

class foo {
public:
    virtual void bar() { }
    int i;
}

32ビットシステムではインスタンスごとに8バイト、vtableポインターに4バイト、 。に4バイトかかりますint

于 2012-11-05T11:22:32.773 に答える
4

C++ では、オブジェクトのサイズをゼロにすることはできません。そのため、ほとんどのコンパイラは、データのないクラスのインスタンスに単一の冗長バイトを挿入します。ただし、そのようなクラスから継承してデータを含める場合、コンパイラは 1 バイトを最適化できます。

#include <iostream>

class Empty
{
};

class Derived : public Empty
{
    int data_;
};

int main(int argc, char** argv)
{
    Empty empty;
    Derived derived;
    int x;
    std::cout << sizeof(empty) << std::endl;    // 1
    std::cout << sizeof(derived) << std::endl;  // 4
    std::cout << sizeof(x) << std::endl;        // 4

    return 0;
}

これは gcc 4.6.3 で行われ、「空のベースの最適化」と呼ばれます。データとパフォーマンスの両方のオーバーヘッドを発生させる方法は、それほど巧妙ではありません。ほとんどの場合、仮想関数が最も重要です。

于 2012-11-05T11:28:06.787 に答える
1

いくつかのオーバーヘッドがあります。たとえば、以下のサンプルは何かを示しています。

class Test {
    char a;
public:
    virtual int getA() {
        return a;
    }    

Test(): a('a'){}
Test(char i): a(i){}
};
  1. クラスに仮想関数を追加すると、ポインター (vptr) サイズがクラス サイズに追加されます。

  2. 位置合わせの制約。Test のサイズは 5 ではなく 8 です。注: メンバー a を int 型から char 型に変更しました。

クラスのレイアウトは次のとおりです。

class Test  size(8):
    +---
   0    | {vfptr}
   4    | a
        | <alignment member> (size=3)
    +---

  Test::$vftable@:
    | &Test_meta
    |  0
   0    | &Test::getA

  Test::getA this adjustor: 0
于 2012-11-05T11:33:23.637 に答える