2017-06-14 4 views
1

私はクラスを持っている:空のベクターは、現在nullptrに設定されている型へのポインタと同じくらいのスペースを占有していますか?

class Foo{ 

std::vector<Sprite*> vec; 
Sprite* bar = nullptr; 

} 

は、私は、その後の操作を行います。

Foo zoom; 

この時点で、より多くのスペースを占有し、プログラムの実行、で? vecまたはbar?

EDIT:以下の状況で

、私がない場合:このコードで

class Foo{ 
Sprite* bar1 = nullptr; 
Sprite* bar2 = nullptr; 
Sprite* bar3 = nullptr; 
} 

または

class Foo{ 
    std::vector<Sprite*> vec; 
} 
+3

ベクターは、明らかに、サイズ、容量、および/または実装に必要なその他の要素を保持する必要があります。それは標準によって定義されていません。 – DeiDei

+3

'sizeof(vec)' ... –

+0

Sprite *の有限個数を追跡する必要があったとします.Sprite *は、最大数に0になる可能性があります。ベクトルを使う方が良いでしょうか、スプライト*はnullptrに初期設定... –

答えて

4

class Foo{ 

    std::vector<Sprite*> vec; 
    Sprite* bar = nullptr; 

}; 
少ないスペースを占有し Foo zoom;

barは、プラットフォームに依存するポインタのサイズになります。多くの場合、32ビット(4バイト)または64ビット(8バイト)のいずれかになります。

vecは、標準ライブラリの実装方法に依存するstd::vectorオブジェクトのサイズになります。

だから我々は本当に絶対確信を持って言うことはできませんが、我々はその型のオブジェクトは、単一のポインタより大きくなることを標準で行うために必要なものstd::vectorに基づいてかなり良い推測を行うことができます。

どのくらいに大きいですか?言いにくい。それは問題だろうか? No.

ポインタの配列を*と宣言して、独自のstd::vectorを構築しようとする衝動に抵抗しないでください。あなたはコンパイラを圧倒しません。標準ライブラリのクラスを使用した場合よりも大きくて遅いコードで終わるでしょう。それが彼らのためにあるのです。

あなたのメモリプロファイラは、実際に問題がここにあることをあなたに言っている場合を除き *
__。

+0

これは私が探している答えの種類なので、Sprite変数が10個あっても10個のx(そのプラットフォーム上のポインタのサイズ)すべてがnullptrに設定されている場合明らかに実際のオブジェクトがあると、彼らはより多くのメモリを使用します... –

+3

それらを 'nullptr'に設定することは、全く違いを生じません。ポインタは、有効なアドレスまたは無効なアドレスに設定されているかどうかにかかわらず、同じサイズです。 –

+0

右 - 私はポインタがヌルptrに設定されているときよりも何もメモリを使い切っていないことを意味しますが、ポインタは指しているオブジェクトになります... –

1

標準は保証しません。実際には、ベクトルオブジェクトは、動的に割り当てられたメモリへのポインタ、その後、どのくらいその動的メモリのが使用されている、そしてどのくらい割り当てられていると言って何かを含める必要があります。

これらは、ポインタまたはカウント可能性がどちらか。実際にはどちらかのメモリ消費量は同じになります。

したがって、通常はsizeof(vec) == 3*sizeof(bar)です。

小さなバッファ最適化(「小さな」ベクトルがオブジェクトに直接割り当てられる)を持つベクトルは、より大きくなる可能性があります。

2

ポインタのサイズとstd::vectorのサイズの両方が標準で定義されていないため、これらの数値をターゲットプラットフォームで自分で把握する必要があります。

は、クラスへのポインタのサイズを取得するには、

sizeof(Spirit*) 

を書いたり、新しいポインタを作成し、そのsizeofを取得する必要があります。

std::vectorの場合、メモリ内の一部のメモリがスタックに割り当てられているため(データへのポインタやサイズなどのstd::vectorに関する情報を格納するため)、状況によっては少し複雑ですヒープ上(データ自体)。メモリstd::vector用途の総量を取得するには、これらの値の両方の合計する必要があります。メモリの私の特定のコンピュータとコンパイラ(x64の、MSVC++ 2015)総量空std::vector使用時には

std::vector<Spirit*> vs; 
sizeof(vs) + vs.capacity() * sizeof(Spirit*) 

を24バイトです。 ターゲットプラットフォームで値が異なる場合もあります。

関連する問題