1

私は C++ が初めてで、質問があります...

テストアプリケーションを作成して、自分で質問に答えようとしました...デバッグでは、クラスBの初期化により生成されるアセンブリコードが少なくなりますが、リリースモードでは、本当に言うことはできません...初期化を最適化します:(

2つのクラスがあるとしましょう:

class A
{
public:
    int a, b, c, d;

    A(int _a, int _b, int _c, int _d) : a(_a), b(_b), c(_c), d(_d)
    {
    }
};

class B
{
public:
    int a, b, c, d;
};

利用するメリットはありますか

B b = {1, 2, 3, 4}

それ以外の

A a = A(1, 2, 3, 4);

?

4

5 に答える 5

4

グローバル オブジェクトと静的クラス メンバーの場合、初期化子リストは実行時にコードを呼び出しません。(初期化データはバイナリに直接格納されます)。

多数のオブジェクトを初期化している場合、またはコンストラクター コードが高価である/大きい場合、これは読み込み時に顕著な違いを生む可能性があります。

前述のように、これは単純な古いデータ、つまり C++ < 0x の初期化子リストで初期化できるすべてのデータにのみ当てはまります。

于 2009-05-23T18:36:06.073 に答える
2

パフォーマンス上の利点についてはわかりませんが、一般的にはコンストラクターを使用することをお勧めします。

これは、A の場合、メンバー a、b、c、d を非公開にできるためです。したがって、B にはない A アプローチでカプセル化を取得します。

クラス デザイナーは、コンストラクターを介してメンバー変数の厳密な使用と割り当てを強制できます。B、クラスのシナリオでは、できません。

したがって、B を使用することでパフォーマンスがわずかに向上する可能性がありますが、私はそれが無視できるものであることに賭けます。

于 2009-05-23T18:09:38.973 に答える
1

このタイプの初期化を使用するコンストラクターと C コードを明示的に記述する必要はなく、C++ で機能します。

単純なデータ フィールドの複雑な複合構造がある場合、変数の初期化は、コンストラクターを使用するよりも初期化リストを使用する方が簡単です。

B barr[5] = {
    {1,2,3,4},
    {5,6,7,8},
    ...
  };

(現在)PODメンバー変数のみを持つ単純なクラスでのみ機能し、プログラマーが構文にあまり慣れていない可能性があるという欠点。

于 2009-05-23T18:18:35.400 に答える
0

ほとんどのクラスは (まだ!) 初期化リストを使用できないため、一貫性を保つためだけにコンストラクターを使用することをお勧めします。c++0x では、std::initializer_list が存在し、任意のクラスでこの構文を使用できるようになります。

于 2009-05-23T18:13:03.960 に答える
0

以下は、イニシャライザ リストが使用されるシナリオです。

  1. 非静的な const データ メンバーの初期化用。
  2. 参照メンバーの初期化用。
  3. デフォルトのコンストラクターを持たないメンバー オブジェクトの初期化用。
  4. 基本クラス メンバーの初期化用。
  5. コンストラクタのパラメータ名がデータメンバと同じ場合。
于 2016-09-28T12:34:09.053 に答える