web-dev-qa-db-ja.com

GCCでmalloc()を調整しましたか?

GCCまたはglibcに、整列ポインタにメモリブロックを割り当てる標準化された関数はありますか? MSVCで _ align_malloc() が好きですか?

36
Dennis Yurichev

memalign 関数ファミリーを参照してください。

29
sigjuice

質問が行われたため、C11によって新しい機能が標準化されました。

void *aligned_alloc(size_t alignment, size_t size);

また、glibcで使用できます(私の知る限り、Windowsでは使用できません)。 memalignと同じ順序で引数を取ります。これは、Microsoftの_aligned_malloc、および割り当て解除に通常と同じfree関数を使用します。

微妙な違いは、aligned_allocには、sizealignmentの倍数である必要があります。

29
Marc Glisse

[posix_memalign()] [1]関数はアライメントされたメモリ割り当てを提供し、glibc 2.1.91以降で使用可能です。

しかし、必ずしも他のコンパイラではありません:標準を引用して「posix_memalign()関数はアドバイザリ情報オプションの一部であり、すべての実装で提供される必要はありません。」

19
jschmier

がある _mm_mallocおよび_mm_freeこれは、少なくともx86/x64世界のほとんどのコンパイラーでサポートされています。

  • gcc
  • MinGW(gcc win32/win64)
  • MSVC
  • クラング
  • ICC

知る限り、これらの関数は標準ではありません。しかし、私の知る限り、最もサポートされているものです。他の関数はよりコンパイラ固有です:

  • _aligned_mallocはMSVCおよびMinGWのみです
  • posix memalign関数は少なくともMSVCではサポートされていません

C11標準関数もありますが、残念ながらc ++ 11にはありません。c++に含めるには、非標準プリプロセッサ定義が必要です...

11
galinette

それはあなたが期待するアライメントの種類に依存します。より厳密なアライメント、またはよりリラックスしたアライメントが必要ですか?

mallocは、定義により、Cプログラムの標準タイプ(したがって、標準タイプから作成されたタイプ)を格納するために適切に位置合わせされたポインターを返すことが保証されています。あなたが探しているものですか?それとも別のものが必要ですか?

4
AnT