0

C ++では、クラスコンストラクターは初期化リストを使用できます。これは、余分な割り当てを回避することで向上するパフォーマンス機能であると言われています。それで、C ++クラスコンストラクターと構造体を初期化するのと基本的に同じ目的を果たす関数に対して、Cで同じ利点を達成するための同様のアプローチがあるのだろうか?

この機能がC++コンパイラでどのように正確に機能するかについては少しわかりません。そのため、このテーマに関する追加情報もありがたいです。

4

4 に答える 4

4

Cには同様の機能はありませんが、Cにもコンストラクターがないため、不要な割り当ての危険性はありません。

より大きな原則は、言語に1つの機能を導入すると、元の機能を強化するために追加の機能が必要になることがよくあるということです。簡単な例はスレッドです。スレッドが機能として言語に組み込まれている場合、それらを同期する方法がすぐに問題になります。したがって、同期も必要です。したがって、組み込みのスレッドや同期がない言語(Cなど)と両方がある言語が表示されますが、一方が他方がない場合は表示されません。ここでは、同期は初期化子をリストするのと同じように、コンストラクターはスレッドになります。

于 2013-03-09T17:08:19.763 に答える
2

C ++コンストラクターでは、初期化リストを使用すると、C ++コンパイラーは、割り当て演算子、コピーコンストラクター、またはmove-コンストラクターを使用してメンバー変数を初期化する代わりに、メンバー変数の場所でメンバーをインプレースでコンストラクターできます。詳細については、C++FAQのセクション10.6を参照してください。

Cでは、Cコンパイラによって提供されるそのような自動操作はありません。これは、プログラマーがすべての初期化を直接制御し、これらの余分な操作を回避するために特別な言語機能が必要ないことを意味します。

もう少し明確にするために、C++コンストラクターで代入を使用して初期化するとどうなるかを考えてみましょう。

  1. メンバー変数は、最初にデフォルトのコンストラクターで作成されます
  2. 一時オブジェクトが作成されます
  3. 代入演算子またはムーブ代入演算子を呼び出して、メンバー変数を一時変数で再初期化します。
  4. 一時的にデストラクタを呼び出します。

一部のコンパイラは状況によってはこれを最適化できますが、マイレージは異なる場合があり、C++コンパイラがすべての状況でこれらの手順を最適化できるわけではありません。ここで、プログラマーがCでこれらの手順を正確に複製する方法を考えてみましょう。

void my_struct_init(struct my_struct* sp)
{
  member_init_default(&sp->the_member);  /* default constructor for member */

  struct member memb; /* temporary on stack */
  member_init_other(&memb, ...params...);  /* initialize memb */
  member_assign(&sp->the_member,&memb);    /* assign member */
  member_finalize(&memb);                  /* finalize the temporary */
}

これを行うCプログラマーはほとんどいません(正当な理由がない場合)。代わりに、最適化を自動的にコーディングします。

  member_init_other(&sp->the_member, ...params...);

この機能はC++に存在します。これは、コンパイラーがプログラマーのために多くの自動処理を行うためです。これにより、プログラマーの作業が楽になることがよくありますが、コンパイラーが最適なコードを生成するのに役立つ初期化リストなどの機能が必要です。Cコンパイラは、基盤となるマシンのはるかに単純なモデルを提示し、自動的に実行する処理が少なくなるため、同様に最適なコードを生成するために必要な機能が少なくなります(必ずしも作業量が少なくなるとは限りません)。

于 2013-03-09T18:32:51.083 に答える
1

Cにはそのような機能はありません。最も近いものは初期化子と呼ばれます。

于 2013-03-09T17:09:31.593 に答える
-1

クラスからオブジェクトを作成するときに別の関数を記述して呼び出し、それをクラスに渡すことができます。

C:

typedef struct {
        int x;
}mine;

void mine_initializer(mine* me)
{
        me->x = 4; //initialization
}

int main(void)
{
        mine me;
        mine_initializer(&me);
        return 0;
}

また、C++でそれを行うことができます。

struct mine{
        int x;
        void initialize()
        {
                x = 4; //initialization
        }
};



void main(void)
{
        mine me;
        me.initialize();
        printf("%d",me.x);
}

結果として出力4されます。

于 2013-03-09T17:20:22.387 に答える