mmap()
は戻り値がシステム上の最大整列に揃うことを保証しますか?すなわち、mmapがalignof(std::max_align_t)
の倍数であるポインタ値を返さなければならないことをPOSIX標準によって保証されていますか?mmapはポインタの値を整列して返します
私ははいそれがない(2)のマニュアルページまたはMAC OSX用のmmap(2)のmanページ
mmap()
は戻り値がシステム上の最大整列に揃うことを保証しますか?すなわち、mmapがalignof(std::max_align_t)
の倍数であるポインタ値を返さなければならないことをPOSIX標準によって保証されていますか?mmapはポインタの値を整列して返します
私ははいそれがない(2)のマニュアルページまたはMAC OSX用のmmap(2)のmanページ
のいずれかのUbuntu Linuxのmmapの上でこの情報を見つけることができませんでした。最も「人気の」NULLマッピング
の場合
http://man7.org/linux/man-pages/man2/mmap.2.html
addrがNULLの場合、カーネルは へのマッピングを作成するアドレスを選択します。これは、新しく マッピングを作成する最も移植性の高い方法です。 addrがNULLでなければ、カーネルはマッピングをどこに置くかについてヒント とします。 Linuxのの場合、マップは付近のページ境界に作成された になります。新しいマッピングのアドレスは、呼び出しの結果として返される です。
あなたは
よりMAP_FIXEDを指定してもヒントとしてaddrの解釈しないでください:まさにその アドレスの場所のマッピングを。 addrは、ページサイズの倍数である必要があります。 addrとlenによって指定された領域 が既存の マッピングのページと重複する場合、既存のマッピングの重複部分は になります。指定したアドレスを使用できない場合、mmap()は に失敗します。マッピングのために固定アドレスを必要とするのは、 以下であるため、このオプションの使用はお勧めしません。実際に、最小のページを撮影
は4096B(x86用が、他のプラットフォームのためにそれはとにかく1024Bの倍数である)とstdようです:: max_align_tは、それがallignedされる64ビットシステム上で16Bである可能性が最も高いです。
私はそれが保証されているかどうかわかりませんが、ハードウェアの能力に支えられているので、そうしなければ非常に驚くでしょう。 –
[このリンク](http://stackoverflow.com/questions/31411730/mmap-enforce-64k-alignment)が役立つ可能性があります。 Quoated:mmapによって返されたアドレスは、ページアライメントされていることが保証されています。 – felix
@felix 'munmap()'のmanページは、 'addrパラメータがページ境界にない(つまり、ページサイズの倍数).'と言っています。つまり、ページ境界にないメモリを割り当て解除できません。ページ境界が最大の配置よりも大きいので、ポインタが最大の位置合わせで整列していない場合には 'munmap()'を呼び出すことができません – Curious