4

次のようにベクトルを宣言すると:

int main() {
    vector<string> names;
    int something_else_on_the_stack = 0;
    names.add("John");
    names.add("Annie");
}

名前ベクトルに要素を実際に「追加」するにはどうすればよいですか? 名前がスタックに割り当てられている場合、「something_else_on_the_stack」はスタックの直後にあるべきではありませんか? では、既に割り当てられているベクトルにどのように名前を追加できますか?

4

3 に答える 3

8

内部的には、vector<string>ほとんどstring*の場合、実際のデータを指す と、size_t占有されているメモリと予約されているメモリを示すさらに 2 つのメンバーで構成されます。残りはすべてヒープになります。したがって、sizeof(vector<string>)固定され、スタック上の割り当ては変更されません。

于 2012-09-20T06:31:24.270 に答える
7

std::vectorinternaly は、必要に応じてサイズ変更されるヒープ割り当て領域へのポインターを維持します。スタック上のフットプリントは変わりません。

于 2012-09-20T06:30:41.993 に答える
2

a がスタック上で占有するサイズvector<string>は固定されており、通常は 3 つのポインターのサイズに等しくなります (これは実装固有です)。ポインターは、ストレージの先頭、ベクトル容量、およびベクトル サイズを指します。これらのポインターは、ベクターに追加するオブジェクトを保持するために必要に応じてベクターが割り当てる空きストア メモリ (またはヒープと呼びたい場合) を指します。

于 2012-09-20T06:34:41.953 に答える