new T[] で割り当てられた配列のサイズを取得できますか?
この質問では、new 演算子を使用してヒープに割り当てられた C 配列のサイズをプログラムで決定するという課題について検討します。
これはなぜ難しいのですか?
宣言された配列とは異なりますスタック (int arr[256];) 上ではコンパイル中に既知の固定サイズを持ちますが、new で割り当てられた配列のサイズは実行時に動的に決定されます。これは、コンパイラーはコンパイル中にそのような配列のサイズを知ることができず、sizeof 演算子はポインター自体のサイズのみを返すことを意味します。
コンパイラーの制限
sizeof はコンパイラによって静的に評価されます。つまり、動的に割り当てられた配列には使用できません。さらに、C 配列はファーストクラスのオブジェクトではなく、ポインターに分解されるため、コンパイラーやプログラムが、割り当てられた配列の先頭へのポインターと、単一のオブジェクトまたは任意のメモリー位置へのポインターを区別することが困難になります。
ランタイムの知識
delete [] は割り当てられたサイズを知っていますが、この知識はランタイムまたはオペレーティング システムのメモリ マネージャーに存在し、コンパイル中にはアクセスできません。
メモリ管理の考慮事項
C および C は、メモリ管理をプログラマとオペレーティング システムに任せます。その結果、new と delete の実装はプラットフォームに依存し、割り当てられた配列サイズを追跡する必要がない場合があります。このアプローチにより、さまざまなシステムで効率的かつ柔軟なメモリ管理が可能になりますが、配列サイズをプログラムで取得する機能が犠牲になります。
以上がC の「new」で割り当てられた配列のサイズを決定できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。