2017-08-04 5 views
18

は、例えば:本当に整列をサポートするrealloc()のバージョンはありませんか?

#include <stdlib.h> 
int posix_memalign(void **memptr, size_t alignment, size_t size); 
void *aligned_alloc(size_t alignment, size_t size); 

#include <malloc.h> 
void *memalign(size_t alignment, size_t size); 

(POSIX、それぞれのglibcとLinuxのlibcの発信)、由緒malloc()のいくつかの整列バージョンが存在します。しかし、私はアライメントをサポートするrealloc()のバージョンについて何も言及していないようです。本当に実装されたことはありませんか?アライメントされていないrealloc()の機能と、アライメントされたmalloc()の種類のメモリの整列したチャンクの検索を組み合わせるのはかなり簡単です。

関連:

Does realloc keep the memory alignment of posix_memalign?

+0

はい。いろいろな理由でいいえはありません。 1つは、割り当てられた割り付けられた関数が、割り付けられたブロックのデータサイズに関する情報を保存せず、データのコピーが不可能であることです。それはアプリケーション開発者に任せられました。適切なメーリングリストのアーカイブを参照してください。 –

+3

@PeterJ: 'malloc()'が保存するよりも_less_情報を保存することをアライメントしていますか?私は非常にそれを疑う...とにかく、もしあなたがこれ以上いくつかの肉体的なことができれば、その議論のいくつかへのリンクが望ましい、答えを投稿してください。 – einpoklum

+0

以下。トピックは、フォーラムにとっては複雑すぎる。メーリングリストのアーカイブを参照してください。 –

答えて

3

整列のreallocだけ_aligned_realloc機能をマイクロソフトに実装されています。 POSIXバージョンは定義されておらず、Linuxでは実装されていません。私は理由を理解できませんでした。なぜなら、それはコード化するのがとても複雑ではないからです。glibc。 広いSIMD命令の出現を考慮して実装するのは時間の問題だと思います。

現時点では、整列したメモリの新しいブロックを割り当て、コンテンツをコピーして古いポインタを解放します。これはとにかくあなたのアプリケーションを遅くすべきではありません。

+2

最後に文章、私はそれは無知ではない...また、我々は可能な場合、正式な情報源が欲しい。 – einpoklum

+2

あなた自身のメモリプールを持ち、独自のアライメントされたreallocを実装することができます。memalign + memcpy + freeのどちらかを使用するか、 "あまりにも愚かではない"ようなもっと役に立つ回答を待つことができます。 – yakoudbz

関連する問題