ここでは、2つの事項をクリアする必要があります。
最初に:malloc
は、あなたが求めた正確なサイズを保持していると仮定します。
実際はありません。 malloc
は、十分に大きいブロックを提供することだけを気にします。効率上の理由からおそらく大部分を占めるわけではありませんが、おそらくおそらく "標準"サイズのブロック、例えば2^n
バイトブロックを与えます。したがって、実際のサイズ(実際に割り当てられたオブジェクトの数)は事実上不明です。
セカンド:「余分なビットが」、確かにそれは、アレイの一部であるか、または単に余分なビットになるかどうかを知るために、指定されたオブジェクトに必要な情報を
を必要としていました。論理的に。
実装に関しては、実際にそのビットをどこに置くのですか?
オブジェクト自体に割り当てられたメモリには、おそらく触れないようにしてください。オブジェクトは、おそらくそれを使用しています。そう ?いくつかのプラットフォーム上
- 、を除いて、少なくともバイト、それは余分なストレージを必要とするであろう、これは(いくつかのプラットフォームは、ビットの部分を無視する)ポインタ自体に保持することができ、これは
- ポータブルありませんアライメントの問題では、8バイトに達する可能性があります。
デモンストレーション:
(STHで述べたように説得力がありません、以下を参照)
// A plain array of doubles:
+-------+-------+-------
| 0 | 1 | 2
+-------+-------+-------
// A tentative to stash our extra bit
+-------++-------++-------++
| 0 || 1 || 2 ||
+-------++-------++-------++
// A correction since we introduced alignment issues
// Note: double's aligment is most probably its own size
+-------+-------+-------+-------+-------+-------
| 0 | bit | 1 | bit | 2 | bit
+-------+-------+-------+-------+-------+-------
Humpf!
EDIT
そのため、ほとんどのプラットフォーム(アドレスは重要ではない場合)には、各ポインタを「拡張」、そして実際にそれらのサイズ(アライメントの問題を)2倍にする必要があります。
余分なビットを隠すことができるように、すべてのポインタが2倍の大きさでよいですか?ほとんどの人にとって私はそうなると思う。しかし、C++は、ほとんどの人のために設計されたものではなく、速度やメモリのどちらかを問わず、パフォーマンスを気にする人のために設計されています。 EDIT OF
END
だから、正解は何ですか?正解は、タイプシステムが失った情報を回復することはコストがかかることです。残念ながら。
なぜ、配列の割り当て解除と破壊を処理する 'delete'の代わりに' delete [] 'があるのですか? –
それはわずかな費用ですが、それを支払うことの利益も小さいです。 –
割り当てのサイズがどこかに格納されていると明示していない限り(私はそれを疑う)、割り当てられたサイズを必ずしも格納する必要はありません。次の例を考えてみましょう: 'int * p = new int;'これを定義された方法で削除する唯一の方法は、 'int *'でdeleteを呼び出すことです。したがって、サイズはint型であることを暗黙のうちに知ることができます。 (注: 'void *'のdeleteの呼び出しはUBです:http://stackoverflow.com/a/941959/239916)。 –