GNU/Linux >> Linux の 問題 >  >> Linux

realloc は posix_memalign のメモリ アラインメントを維持しますか?

いいえ、realloc posix_memalign から返されたメモリについて ISO または POSIX のいずれによっても、同じアライメントを維持することは保証されていません。 realloc かもしれません 単純に現在のブロックを同じアドレスで拡張しますが、ブロックを元のブロックよりアライメントが厳密でない別のアドレスに移動することもあります。

同じ配置が必要な場合は、別のブロックを割り当ててデータをコピーするのがおそらく最善です。

残念ながら posix_memalign_realloc はありません 単一 UNIX 仕様のいずれかで機能します。

毎回データをコピーする手間をかけたくない場合 今度は realloc を試すことができます そして、その位置合わせが期待どおりでなかった場合は、そのときだけ posix_memalign を呼び出す 正しく配置されたアドレスを取得してそこにデータをコピーし、完了したら古いアドレスを解放します。

これにより、以下が発生する可能性があります:

  • ゼロ コピー (現在のブロックをその場で展開できる場合);
  • 1 部 (realloc の場合) コピーしますが、たまたま正しく配置されたブロックが得られます);または
  • 2 部 (realloc の場合) コピーしてから、ずれのためにコピーする必要があります)。

かもしれません また、基になるメモリ管理の実装によっては、示されているよりもコピーが少なくなります。たとえば、「コピー」には、データを物理的に移動するのではなく、単にメモリ ブロックを再マッピングすることが含まれる場合があります。

したがって、このスキームが価値があるかどうかを確認するために、いくつかの統計を保持することをお勧めします。

POSIX や Linux のマニュアル ページでは、できるかどうかさえ指定されていないことに注意してください。 これらのポインタを realloc に渡します 、 free に渡すことができるだけです .

ただし、現在の GNU libc ソース コードに基づくと、動作しているように見えますが、今後も動作し続けるという保証はありません :-)

私が恐れていたのは、通常どおりにメモリを割り当て (標準アライメント)、オフセット アドレスを返すことでした (つまり、実際に割り当てられたアドレスではなく、1 つの N)。 それ以上のバイト) which free 魔法を織り込む前に実際のアドレスに戻るほどの知性を持っていた.

その方法の 1 つは、実際の 返されたアドレスの直前のアドレスはもちろん、これは通常の割り当てでも浪費につながります.

その場合、free インテリジェント化されている可能性があります(仕様では、posix_memalign によって行われた割り当てを処理できなければならないと言われているため) ) でも realloc 同じ知性が与えられていない可能性があります (ドキュメントはその件について沈黙しているため)。

ただし、GNU glibc 2.14.1 に基づいて、実際には必要以上のメモリを割り当ててから、アリーナをいじって前後のスペースを解放し、返されるアドレスが「実際の」アドレスになり、free または realloc .

ただし、前述のとおり、ドキュメントはこれを保証していません。


Linux
  1. Linux – Oom Killerはどのプロセスを最初に殺すかをどのように決定しますか?

  2. テールはファイル全体を読み取りますか?

  3. LANネットワーク上でコンピューターを見つけますか?

  1. malloc はメモリまたは仮想アドレス空間を返します

  2. 実行権限は何をしますか?

  3. Linux Mint はデフォルトのデスクトップ壁紙のファイルをどこに保存していますか?

  1. Linuxカーネル:イノベーショントップ5

  2. ps コマンドはどのように機能しますか?

  3. CPU は、どの物理アドレスがどの仮想アドレスにマップされているかをどのように認識しますか?