malloc() は少なくとも必要なサイズを割り当てるので、それ以上のサイズを提供できることを理解しています。問題は、同じアーキテクチャで少なくとも同じメモリ サイズが得られるかどうかです。
例:
int * myint = (int*)malloc(sizeof(int))
sizeof(myint) //---> this gives me 8
私のコンピューターでは毎回8になりますか?
を実行しなくてもmalloc
、それでも8 が返されます。これは、malloc とはまったく関係がないためです。
sizeof
引数の型のインスタンスを格納するために必要なサイズを示すコンパイル時の定数です。引数のタイプは でint *
あり、コンパイラは明らかに 64 ビット用にコンパイルされるため、ポインタは 8 バイトかかります。
注: C++ では、sizeof
常にコンパイル時の定数です。C では、配列の実際の実行時サイズが返される可変長配列の特殊なケースがあります。ただし、C++ には可変長配列がないため、この特殊なケースを気にする必要はありません。
別の注意: C++ では、他のコレクションを使用する必要がvector
あります。make_unique
new
malloc
ランタイムによってバックグラウンドで予約されているメモリの量を正確に知る標準的な方法はありません。また、最初にいくら要求したかを知る標準的な方法さえありません。(これを覚える必要がある場合は、自分で保存する必要があります。)
特定の実装では、要求したとおりに、またはそれ以上の金額を予約する場合があり、それは時々変わる場合があります。しかし、あなたは知っているべきでも、気にするべきでもありません。
他の人が指摘したように、あなたのコードでは、実際にint*
は、割り当てられたブロックのサイズではなく、ポインターのサイズを求めています。
sizeof
コンパイル時の値であるため、特定のコンパイルでは常に同じ値を返します (プログラムの実行時には決定されません。
ただし、たとえば、私の 64 ビット ubuntu マシンは 32 ビット コードも実行でき、32 ビット実行可能ファイル (例: を使用gcc -m32 ...
) をコンパイルするか、64 ビット実行可能ファイルをコンパイルするかによって、一部の型のサイズが変わることに注意してください。したがって、によって返される値はsizeof
、コンパイル オプションに依存する場合があります。
sizeof(myint)
ただし、コードではポインターのサイズを返しますが、実際に割り当てられたメモリ ブロックの実際のサイズを知る方法はありません (これは malloc の実装に委ねられる詳細です)。から返された値から (移植可能に) わかることmalloc
は、それが十分なメモリ (つまり、要求したものよりも少なくない) であり、基本的な型を格納するために使用できる (プラットフォームで最も厳密なアライメントを尊重する) ことだけです。
これは、割り当てられたメモリのサイズではなく、ポインターのサイズを調べているためです。