はい、絶対に。
割り当てられたすべてのメモリブロックには、小さな可変部分(通常は最後)と同様に、「ヘッダー」の一定のオーバーヘッドがあります。正確にどれくらいの量が使用される正確なCランタイムライブラリに依存します。これまでは、割り当てごとに約32〜64バイトであることが実験的に分かっていました。可変部分はアラインメントに対処することです - 各メモリブロックは2^nベースアドレス(通常は8または16バイト)に整列されます。
私はstd::map
などの内部設計の仕組みに精通していませんが、私はそこに特別な最適化があることを非常に疑っています。
あなたは非常に簡単でオーバーヘッドをテストすることができます。おそらく、ここの常連のほとんどである、pedantsに注意してください[
char *a, *b;
a = new char;
b = new char;
ptrdiff_t diff = a - b;
cout << "a=" << a << " b=" << b << " diff=" << diff;
、上記ABの式は、1枚のアドレスを減算するので、未定義の動作を起動します割り当てられたアドレスと別のアドレスが未定義の動作です。これは、線形メモリアドレスを持たない機械に対処するためである。 「異なるタイプのデータは、そのタイプに基づいて場所に格納されます」。上記のことは、ヒープ用に複数のデータセグメントを持つセグメント化されたメモリモデルを使用しないx86ベースのOS(つまり、32ビットと64ビットモードでWindowsとLinuxで確実に動作すること)で確実に動作するはずです。
あなたは様々なタイプでそれを実行することをお勧めします - ちょうどdiffがである「タイプの数なので、あなたがそれを作る場合はになります 『』 4つのバイト単位ことを心に留めてあなたがreinterpret_cast<char*>(a) - reinterpret_cast<char *>(b);
を作ることができます。
[diffは負であってもよく、あなたが(a
とb
を削除せずに)ループでこれを実行する場合は、メモリの大部分が排出される突然のジャンプを見つけること、およびランタイムライブラリは別の大きなブロックを割り当て]
通常、配列を割り当てるとき、いくつかのバイトが最初に格納され、将来の削除のために割り当てられたサイズが割り当てられます。大規模な割り当ての場合、オーバーヘッドはnoneに近くなります。一度に4バイトを割り当てると、メモリを2倍にすることができます。 –