0

私は効果的なc ++の本を読んでいます.1つのページには次のように書かれています:

C++ の C 部分を使用していて、初期化によってランタイム コストが発生する可能性がある場合、それが発生する保証はありません。C++ の非 C 部分に踏み込むと、状況が変わることがあります。これは、配列 (C++ の C 部分から) の内容が初期化されることが必ずしも保証されていないが、ベクトル (C++ の STL 部分から) が保証されている理由を説明しています。

c++ の c 部分からの配列が初期化されることが保証されていないのに、ベクトルが初期化されるのはなぜだろうか? c部分からの配列は組み込み型ではないでしょうか?しかし、(C++ の STL 部分からの) ベクトルが初期化されることが保証されているのはなぜですか?

4

4 に答える 4

5

基準がそう言っているからです。C++ の仕様の非常に早い段階で、C で定義された型の動作方法を変更しないことが決定されました。したがって、配列 ( T[]) は、1) 型Tにコンストラクターがある場合、2) 明示的な初期化がある場合、または 3) 静的な有効期間がある場合にのみ初期化されます。は C から継承されていないため std::vector、考慮すべき C の先例はありません。また、ベクターに対して実行できる操作の一部にはコピーが必要なため、初期化する必要があります。初期化されていない値のコピーは未定義の動作です。

C++11 ではstd::array、C の規則に従うことに注意してください。(これは、集約の初期化を可能にするために行われます。)

于 2013-09-20T08:56:53.327 に答える
1

int a[10];(非静的に)定義すると、 の内容a初期化されません。これが、C および C++ の設計方法です。あなたはそれを求めませんでした、あなたはそれを手に入れません。(初期化された配列が必要な場合は、と言ったでしょうint a[10]();。)

C++ では、クラスstd::vector<int>は、ユーザーが何をしようとも、明確に定義されたセマンティクスを持つように設計されています。したがって、 を定義すると、値が初期化された (つまり、ゼロになった) 要素std::vector<int> v(10)が 10 個得られます (上記の 2 番目の例と同様)。

ただし、必要のないものにはお金を払わないことは関係なく適用され、後者はおそらく貧弱な C++ です。通常使用するのはreserveで、これは C のようにメモリを作成しますが、オブジェクトは作成しません。オブジェクトは必要に応じて作成され、それ以上の割り当ては必要ありません。

std::vector<int> v;            // no allocation (hopefully)
v.reserve(10);                 // one single allocation

for (int i = 0; i != 10; ++i)
    v.push_back(i);            // no allocations, guaranteed

一言で言えば: C はmemoryについてしか知りません。C++ では、ストレージオブジェクトの概念が分離されています。このきめの細かいモデルは、より豊富なインターフェイスに対応しています。C では、「このストレージが必要かもしれないが、まだ何も入れていない」という概念を単純に表現することはできません。

于 2013-09-20T08:59:41.473 に答える
0

C++ のような型vectorは実際にはクラスであり、組み込みのコンストラクター (この型の変数を作成するときに自動的に呼び出されるプロシージャ) があり、STL コンテナーのコンストラクターは変数を初期化できます。また、C 由来のものを使用する場合は、はるかに単純です。変数を作成するときに行うことは、大まかに言えば、必要に応じてメモリの一部を取得することだけです。このメモリに何かがある場合、このタイプの変数 (単純な配列など) の作成にはそのためのメモリの検索のみが含まれるという理由だけで、そこにとどまります。

于 2013-09-20T08:59:12.007 に答える