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

ページサイズがアラインされたメモリをどのように割り当てますか?

mallocだけでは不可能だと思います。 memalign() を使用できます:

char *data = memalign(PAGESIZE, alloc_size);

どこ PAGESIZE はページのサイズで、alloc_size 割り当てられるメモリのサイズです。

ページのサイズは sysconf(_SC_PAGESIZE) でわかります .


このために使用する関数があります。

何らかの理由でそれができない場合、これは通常、ブロック サイズを割り当てサイズに加算してから、整数演算のトリックを使用してポインターを丸めます。

このようなもの:

/* Note that alignment must be a power of two. */
void * allocate_aligned(size_t size, size_t alignment)
{
  const size_t mask = alignment - 1;
  const uintptr_t mem = (uintptr_t) malloc(size + alignment);
  return (void *) ((mem + mask) & ~mask);
}

これはあまり深くテストされていませんが、アイデアはわかります。

free() への適切なポインタを把握できなくなることに注意してください。 記憶は後で。これを修正するには、機械を追加する必要があります:

typedef struct {
  void *aligned;
} AlignedMemory;

AlignedMemory * allocate_aligned2(size_t size, size_t alignment)
{
  const size_t mask = alignment - 1;
  AlignedMemory *am = malloc(sizeof *am + size + alignment);
  am->aligned = (void *) ((((uintptr_t) (am + 1)) + mask) & ~mask);
  return am;
}

これにより、ポインターのトリックが少しラップされ、free() できるポインターが得られます。 、ただし、 aligned に逆参照する必要があります 適切に配置されたポインターを取得するためのポインター。


Linux
  1. LinuxコマンドラインでRAMサイズをGbで確認する方法

  2. Linuxでjvmに割り当てられたヒープサイズを確認する方法

  3. Dwarf-fortress でフォント サイズを変更するにはどうすればよいですか?

  1. Linux で合計 RAM サイズとメモリ使用量を確認する方法

  2. CentOS + cPanelでスワップサイズを増やす方法

  3. C++でCPUキャッシュページサイズをプログラムで取得する方法は?

  1. Linux でプロセスのヒープ サイズを確認する方法

  2. 22B の最小サイズ (空の) zip ファイルを作成するにはどうすればよいですか?

  3. メモリ帯域幅を観察するにはどうすればよいですか?