posix_memalign関数でソートにsizeof(void *)が必要なのはなぜですか?

posix_memalign関数でソートにsizeof(void *)が必要なのはなぜですか?

posix_memalign()マニュアルページでは、書き込みパラメータはでalignmentなければなりませんpower of two and a multiple of sizeof(void *)

同様のプログラムにはパラメータのみがmemalign()必要です。alignmenta power of two

パラメータがsizeof(void *)の倍数でなければなりませんが、そうでposix_memalign()ないのはなぜですか?alignmentmemalign()

ソースコード(具体的にglibc実装)を見ると、内部的に関数がposix_memalign()呼び出されますmemalign()。これらの2つの機能(1つはposix一貫性があり、もう1つは一貫性がありません)の違いは何ですかalignment?なぜ変数の要件に違いがあるのですか?

技術的な説明をいただきありがとうございます。ありがとうございます。

答え1

これらの違いは歴史的な理由によるものです。

memalign()お客様が説明する緩和ソート要件は、SunOSに導入され維持されました。GNU Cライブラリから(しかしソラリスから)。

posix_memalign()POSIXの一部です特に、返されたポインタが直接ブロックデバイスI / Oに使用され、割り当てられたメモリを解放するために使用されることを確実にするために、より厳しいソート要件がありますfree()。一部の実装では、memalign()これらの要件を満たしていません。バラよりLinuxのマニュアルページのコメント。 POSIXは、プラットフォームの適用範囲を含む幅広いアプリケーションとして機能を指定するため、POSIX準拠が必要なほとんどのプラットフォームで実装の問題を引き起こさないように、基本的な要件が十分に強力である必要があります。

sizeof(void *)プラットフォームのポインタサイズは、上記の2つを含むさまざまな状況で歴史的に一般的な最小アライメント要件でした。

関連情報